当前位置: 首页 > 编程日记 > 正文

对MBProgressHUD进行封装并精简使用

几个效果图:

以下源码是MBProgressHUD支持最新的iOS8的版本,没有任何的警告信息

MBProgressHUD.h 与 MBProgressHUD.m

MBProgressHUD.h
MBProgressHUD.m

以下是本人在MBProgressHUD基础上封装的类,觉得部分的使用基于block

ShowHUD.h 与 ShowHUD.m

复制代码
//
//  ShowHUD.h
//  TestHUD
//
//  Created by YouXianMing on 14-9-29.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "MBProgressHUD.h"
@class ShowHUD;// 定义block
typedef void (^ConfigShowHUDBlock)(ShowHUD *config);
typedef UIView *(^ConfigShowHUDCustomViewBlock)();// 定义枚举值
typedef enum {Fade    = MBProgressHUDAnimationFade,Zoom    = MBProgressHUDAnimationZoom,ZoomOut = MBProgressHUDAnimationZoomOut,ZoomIn  = MBProgressHUDAnimationZoomIn,
} HUDAnimationType;@interface ShowHUD : NSObject// 动画效果
@property (nonatomic, assign) HUDAnimationType   animationStyle;  // 动画样式// 文本加菊花
@property (nonatomic, strong) NSString          *text;            // 文本
@property (nonatomic, strong) UIFont            *textFont;        // 文本字体// 自定义view
@property (nonatomic, strong) UIView            *customView;      // 自定义view  37x37尺寸// 只显示文本的相关设置
@property (nonatomic, assign) BOOL               showTextOnly;    // 只显示文本// 边缘留白
@property (nonatomic, assign) float              margin;          // 边缘留白// 颜色设置(设置了颜色之后,透明度就会失效)
@property (nonatomic, strong) UIColor           *backgroundColor; // 背景颜色
@property (nonatomic, strong) UIColor           *labelColor;      // 文本颜色// 透明度
@property (nonatomic, assign) float              opacity;         // 透明度// 圆角
@property (nonatomic, assign) float              cornerRadius;    // 圆角// 仅仅显示文本并持续几秒的方法
/* - 使用示例 -[ShowHUD showTextOnly:@"请稍后,显示不了..."configParameter:^(ShowHUD *config) {config.margin          = 10.f;    // 边缘留白config.opacity         = 0.7f;    // 设定透明度config.cornerRadius    = 2.f;     // 设定圆角} duration:3 inView:self.view];*/
+ (void)showTextOnly:(NSString *)textconfigParameter:(ConfigShowHUDBlock)configduration:(NSTimeInterval)secinView:(UIView *)view;// 显示文本与菊花并持续几秒的方法(文本为nil时只显示菊花)
/* - 使用示例 -[ShowHUD showText:@"请稍后,显示不了..."configParameter:^(ShowHUD *config) {config.margin          = 10.f;    // 边缘留白config.opacity         = 0.7f;    // 设定透明度config.cornerRadius    = 2.f;     // 设定圆角} duration:3 inView:self.view];*/
+ (void)showText:(NSString *)textconfigParameter:(ConfigShowHUDBlock)configduration:(NSTimeInterval)secinView:(UIView *)view;// 加载自定义view并持续几秒的方法
/* - 使用示例 -[ShowHUD showText:@"请稍后,显示不了..."configParameter:^(ShowHUD *config) {config.margin          = 10.f;    // 边缘留白config.opacity         = 0.7f;    // 设定透明度config.cornerRadius    = 2.f;     // 设定圆角} duration:3 inView:self.view];*/
+ (void)showCustomView:(ConfigShowHUDCustomViewBlock)viewBlockconfigParameter:(ConfigShowHUDBlock)configduration:(NSTimeInterval)secinView:(UIView *)view;+ (instancetype)showTextOnly:(NSString *)textconfigParameter:(ConfigShowHUDBlock)configinView:(UIView *)view;
+ (instancetype)showText:(NSString *)textconfigParameter:(ConfigShowHUDBlock)configinView:(UIView *)view;
+ (instancetype)showCustomView:(ConfigShowHUDCustomViewBlock)viewBlockconfigParameter:(ConfigShowHUDBlock)configinView:(UIView *)view;
- (void)hide;@end
复制代码
复制代码
//
//  ShowHUD.m
//  TestHUD
//
//  Created by YouXianMing on 14-9-29.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ShowHUD.h"#ifdef DEBUG
#define ShowHUD_DLog(fmt, ...) NSLog((@"ShowHUD.m:%s:%d" fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define ShowHUD_DLog(...)
#endif@interface ShowHUD ()<MBProgressHUDDelegate>{MBProgressHUD   *_hud;
}@end@implementation ShowHUD- (instancetype)initWithView:(UIView *)view
{if (view == nil) {return nil;}self = [super init];if (self) {_hud = [[MBProgressHUD alloc] initWithView:view];_hud.delegate                  = self;                       // 设置代理_hud.animationType             = MBProgressHUDAnimationZoom; // 默认动画样式_hud.removeFromSuperViewOnHide = YES;                        // 该视图隐藏后则自动从父视图移除掉[view addSubview:_hud];}return self;
}- (void)hide:(BOOL)hide afterDelay:(NSTimeInterval)delay
{[_hud hide:hide afterDelay:delay];
}- (void)hide
{[_hud hide:YES];
}- (void)show:(BOOL)show
{// 根据属性判断是否要显示文本if (_text != nil && _text.length != 0) {_hud.labelText = _text;}// 设置文本字体if (_textFont) {_hud.labelFont = _textFont;}// 如果设置这个属性,则只显示文本if (_showTextOnly == YES && _text != nil && _text.length != 0) {_hud.mode = MBProgressHUDModeText;}// 设置背景色if (_backgroundColor) {_hud.color = _backgroundColor;}// 文本颜色if (_labelColor) {_hud.labelColor = _labelColor;}// 设置圆角if (_cornerRadius) {_hud.cornerRadius = _cornerRadius;}// 设置透明度if (_opacity) {_hud.opacity = _opacity;}// 自定义viewif (_customView) {_hud.mode = MBProgressHUDModeCustomView;_hud.customView = _customView;}// 边缘留白if (_margin > 0) {_hud.margin = _margin;}[_hud show:show];
}#pragma mark - HUD代理方法
- (void)hudWasHidden:(MBProgressHUD *)hud
{[_hud removeFromSuperview];_hud = nil;
}#pragma mark - 重写setter方法
@synthesize animationStyle = _animationStyle;
- (void)setAnimationStyle:(HUDAnimationType)animationStyle
{_animationStyle    = animationStyle;_hud.animationType = (MBProgressHUDAnimation)_animationStyle;
}
- (HUDAnimationType)animationStyle
{return _animationStyle;
}#pragma mark - 便利的方法
+ (void)showTextOnly:(NSString *)textconfigParameter:(ConfigShowHUDBlock)configduration:(NSTimeInterval)secinView:(UIView *)view
{ShowHUD *hud     = [[ShowHUD alloc] initWithView:view];hud.text         = text;hud.showTextOnly = YES;hud.margin       = 10.f;// 配置额外的参数config(hud);// 显示[hud show:YES];// 延迟sec后消失[hud hide:YES afterDelay:sec];
}+ (void)showText:(NSString *)textconfigParameter:(ConfigShowHUDBlock)configduration:(NSTimeInterval)secinView:(UIView *)view
{ShowHUD *hud     = [[ShowHUD alloc] initWithView:view];hud.text         = text;hud.margin       = 10.f;// 配置额外的参数config(hud);// 显示[hud show:YES];// 延迟sec后消失[hud hide:YES afterDelay:sec];
}+ (void)showCustomView:(ConfigShowHUDCustomViewBlock)viewBlockconfigParameter:(ConfigShowHUDBlock)configduration:(NSTimeInterval)secinView:(UIView *)view
{ShowHUD *hud     = [[ShowHUD alloc] initWithView:view];hud.margin       = 10.f;// 配置额外的参数config(hud);// 自定义Viewhud.customView   = viewBlock();// 显示[hud show:YES];[hud hide:YES afterDelay:sec];
}+ (instancetype)showTextOnly:(NSString *)textconfigParameter:(ConfigShowHUDBlock)configinView:(UIView *)view
{ShowHUD *hud     = [[ShowHUD alloc] initWithView:view];hud.text         = text;hud.showTextOnly = YES;hud.margin       = 10.f;// 配置额外的参数config(hud);// 显示[hud show:YES];return hud;
}+ (instancetype)showText:(NSString *)textconfigParameter:(ConfigShowHUDBlock)configinView:(UIView *)view
{ShowHUD *hud     = [[ShowHUD alloc] initWithView:view];hud.text         = text;hud.margin       = 10.f;// 配置额外的参数config(hud);// 显示[hud show:YES];return hud;
}+ (instancetype)showCustomView:(ConfigShowHUDCustomViewBlock)viewBlockconfigParameter:(ConfigShowHUDBlock)configinView:(UIView *)view
{ShowHUD *hud     = [[ShowHUD alloc] initWithView:view];hud.margin       = 10.f;// 配置额外的参数config(hud);// 自定义Viewhud.customView   = viewBlock();// 显示[hud show:YES];return hud;
}- (void)dealloc
{ShowHUD_DLog(@"资源释放了,没有泄露^_^");
}@end
复制代码

使用时候的源码如下:

复制代码
//
//  ViewController.m
//  TestHUD
//
//  Created by YouXianMing on 14-9-29.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "ShowHUD.h" // 引入头文件typedef enum : NSUInteger {CASE_1, // 显示文本和菊花,延时3秒后消失CASE_2, // 仅仅显示文本,延时3秒后消失CASE_3, // 加载自定义view,3秒后消失
} E_CASE;@interface ViewController ()<MBProgressHUDDelegate>@property (nonatomic, assign) NSInteger  caseType;@end@implementation ViewController- (void)showHUD
{UIWindow *window =  [UIApplication sharedApplication].keyWindow;switch (_caseType++ % 3) {case CASE_1: {[ShowHUD showText:@"YouXianMing"configParameter:^(ShowHUD *config) {config.margin          = 10.f;    // 边缘留白config.opacity         = 0.7f;    // 设定透明度config.cornerRadius    = 1.f;     // 设定圆角config.textFont        = [UIFont systemFontOfSize:11.f];} duration:3 inView:window];} break;case CASE_2: {[ShowHUD showTextOnly:@"YouXianMing"configParameter:^(ShowHUD *config) {config.animationStyle  = ZoomOut;  // 设置动画方式config.margin          = 20.f;     // 边缘留白config.opacity         = 0.8f;     // 设定透明度config.cornerRadius    = 0.1f;     // 设定圆角config.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.8];  // 设置背景色config.labelColor      = [[UIColor whiteColor] colorWithAlphaComponent:1.0];// 设置文本颜色} duration:3 inView:window];} break;//        case CASE_3: {
//            BackgroundView *backView = [[BackgroundView alloc] initInView:window];
//            backView.startDuration = 0.25;
//            backView.endDuration   = 0.25;
//            [backView addToView];
//            
//            ShowHUD *hud = [ShowHUD showCustomView:^UIView *{
//                // 返回一个自定义view即可,hud会自动根据你返回的view调整空间
//                MulticolorView *showView = [[MulticolorView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
//                showView.lineWidth       = 1.f;
//                showView.sec             = 1.5f;
//                showView.colors          = @[(id)[UIColor cyanColor].CGColor,
//                                             (id)[UIColor yellowColor].CGColor,
//                                             (id)[UIColor cyanColor].CGColor];
//                [showView startAnimation];
//                return showView;
//            } configParameter:^(ShowHUD *config) {
//                config.animationStyle  = Zoom;   // 设定动画方式
//                config.margin          = 10.f;   // 边缘留白
//                config.cornerRadius    = 2.f;    // 边缘圆角
//                config.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.4f];
//            } inView:window];
//            
//            // 延迟5秒后消失
//            [GCDQueue executeInMainQueue:^{
//                [hud hide];
//                [backView removeSelf];
//            } afterDelaySecs:5];
//        } break;default:break;}
}- (void)viewDidLoad {[super viewDidLoad];_caseType = 0;UIButton *button = [[UIButton alloc] initWithFrame:self.view.bounds];[self.view addSubview:button];[button addTarget:selfaction:@selector(buttonEvent:)forControlEvents:UIControlEventTouchUpInside];
}- (void)buttonEvent:(id)sender
{[self showHUD];
}@end
复制代码

以下是使用上的一些小细节

相关文章:

基于Hash的消息认证码HMAC简介及在OpenSSL中使用举例

HMAC(Hash-based Message Authentication Code)&#xff1a;基于Hash的消息认证码&#xff0c;是一种通过特别计算方式之后产生的消息认证码(MAC)&#xff0c;使用密码散列函数&#xff0c;同时结合一个加密密钥。它可以用来保证数据的完整性&#xff0c;同时可以用来作某个消息…

英特尔发布oneAPI软件计划及beta产品,面向异构计算提供统一可扩展的编程模型

近日&#xff0c;在2019年超级计算大会上&#xff0c;英特尔发布了一项全新软件行业计划oneAPI&#xff0c;助力充分释放高性能计算与人工智能技术融合时代多架构计算的潜力&#xff0c;同时发布了一个oneAPI beta产品。 英特尔oneAPI行业计划&#xff0c;为跨多种包括CPU、GP…

Mac下配置Maven

1.Java环境变量设置就不说。 但是配置Maven需要检查下Java环境变量的设置。需要检查JAVA_HOME环境变量以及Java命令 wanyakundeMacBook-Pro:Library wanyakun$ echo $JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home wanyakundeMacBook-Pro:Librar…

UIAlertAction的用法

let alertController UIAlertController(title:"系统提示", message:"您确定要退出程序吗&#xff1f;", preferredStyle: .alert) let cancelAction UIAlertAction(title:"取消", style: .cancel, handler:nil) let okAction UIAlertAction(tit…

在Windows和Linux上编译gRPC源码操作步骤(C++)

gRPC最新发布版本为v1.23.0&#xff0c;下面以此版本为例说明在Windows和Linux下编译过程。 Windows7/10 vs2103编译gRPC源码操作步骤&#xff1a; 1. 需要本机已安装Git、CMake、Perl、Go、yasm&#xff1b; 2. 依次执行如下命令&#xff1a; git clone https://github.co…

这些算法工程师,他们真的是太难了!

现在的算法工程师真的是太难了&#xff01;要让AI会看人眼都分辨不清的医疗影像数据又不够&#xff0c;还得用前沿技术好不容易学会看片&#xff0c;还要让AI会分析病理赋予AI诊断疾病的使命然后几十种模型&#xff0c;N次计算只给一张显卡Boss就问&#xff1a;你打算怎么做&am…

Java 汉子转拼音

1. 引入: pinyin4j-1.1.0 包; http://pan.baidu.com/s/1eQ8a874 2. 转换; private static String ChineseToPinyin(String name){String pinyinName"";char[] nameChar name.toCharArray(); HanyuPinyinOutputFormat defaultFormat new HanyuPinyinOutputFormat()…

Swift - 使用Alamofire通过HTTPS进行网络请求,及证书的使用

&#xff08;本文代码已升级至Swift3&#xff09; 我原来写过一篇文章介绍如何使用证书通过SSL/TLS方式进行网络请求&#xff08;Swift - 使用URLSession通过HTTPS进行网络请求&#xff0c;及证书的使用&#xff09;&#xff0c;当时用的是 URLSession。本文介绍如何使用 Alam…

gRPC简介及简单使用(C++)

gRPC是一个现代的、开源的、高性能远程过程调用(RPC)框架&#xff0c;可以在任何平台运行。gRPC使客户端和服务器端应用程序能够透明地进行通信&#xff0c;并简化了连接系统的构建。gRPC支持的语言包括C、Ruby、Python、Java、Go等。 gRPC默认使用Google的Protocol Buffers&a…

YC中国被撤,陆奇独立运营个人新品牌「奇绩创坛」

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;近日&#xff0c;Y Combinator&#xff08;以下简称 YC&#xff09; 发布消息称&#xff0c;YC 将撤回 YC 中国业务与运营&#xff0c;这一品牌也将停止使用&#xff0c;YC的战略布局将调整重新…

shell 脚本逐行读取多个文件,并逐行对应

#!/bin/bashfor i in seq 448doaaased -n "$i"p num.txtbbbsed -n "$i"p text.txt/root/cooper/sms.pl $aaa $bbbdonenum.txt 记录了348个号码text.txt中记录了348个字段效果是取num.txt中第一行作为第一行参数 取text.txt中第一行作为第二个参数num.txt要…

iOS常用知识点1

多线程、特别是NSOperation 和 GCD 的内部原理。 运行时机制的原理和运用场景。 SDWebImage的原理。实现机制。如何解决TableView卡的问题。 block和代理的&#xff0c;通知的区别。block的用法需要注意些什么。 strong&#xff0c;weak&#xff0c;retain&#xff0c;assign&a…

美团BERT的探索和实践 | CSDN原力计划

扫码参与CSDN“原力计划”作者 | 杨扬 佳昊 金刚等来源 | CSDN原力计划作品*点击阅读原文&#xff0c;查看美团技术团队更多干货文章。背景2018年&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;领域最激动人心的进展莫过于预训练…

程序员的自我修养--链接、装载与库笔记:可执行文件的装载与进程

可执行文件只有装载到内存以后才能被CPU执行。 1. 进程虚拟地址空间 程序和进程有什么区别&#xff1a;程序(或者狭义上讲可执行文件)是一个静态的概念&#xff0c;它就是一些预先编译好的指令和数据集合的一个文件&#xff1b;进程则是一个动态的概念&#xff0c;它是程序运…

JDBC实例--工具类升级,使用Apache DBCP连接池重构DBUtility,让连接数据库更有效,更安全...

直接使用JDBC访问数据库时&#xff0c;需要避免以下隐患: 1. 每一次数据操作请求都需要建立数据库连接、打开连接、存取数据和关闭连接等步骤。而建立和打开数据库连接是一件既耗资源又费时的过程&#xff0c;如果频繁发生这种数据库操作&#xff0c;势必会使系统性能下降。 2.…

程序员的自我修养--链接、装载与库笔记:Linux共享库的组织

共享库(Shared Library)概念&#xff1a;其实从文件结构上来讲&#xff0c;共享库和共享对象没什么区别&#xff0c;Linux下的共享库就是普通的ELF共享对象。由于共享对象可以被各个程序之间共享&#xff0c;所以它也就成为了库的很好的存在形式&#xff0c;很多库的开发者都以…

iOS下JS与原生OC互相调用

iOS开发免不了要与UIWebView打交道&#xff0c;然后就要涉及到JS与原生OC交互&#xff0c;今天总结一下JS与原生OC交互的两种方式。 JS调用原生OC篇 方式一 第一种方式是用JS发起一个假的URL请求&#xff0c;然后利用UIWebView的代理方法拦截这次请求&#xff0c;然后再做相…

马斯克发首款会上火星的电动皮卡:28万起,可防弹,造型相当“赛博朋克”...

整理 | Jane、非主流出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】马斯克今日发布酝酿多年、“真爱系列”的第一辆电动皮卡Cybertruck&#xff0c;Cybertruck 是赛博朋克&#xff08;cyberpunk&#xff09;与卡车&#xff08;truck&#xff09;…

让你提升命令行效率的 Bash 快捷键

为什么80%的码农都做不了架构师&#xff1f;>>> 原文&#xff1a;http://linuxtoy.org/archives/bash-shortcuts.html 生活在 Bash shell 中&#xff0c;熟记以下快捷键&#xff0c;将极大的提高你的命令行操作效率。 编辑命令 Ctrl a &#xff1a;移到命令行首Ct…

程序员的自我修养--链接、装载与库笔记:Windows下的动态链接

Windows下的PE的动态链接与Linux下的ELF动态链接相比&#xff0c;有很多类似的地方&#xff0c;但也有很多不同的地方。 1. DLL简介 DLL即动态链接库(Dynamic-Link Library)的缩写&#xff0c;它相当于Linux下的共享对象。Windows系统中大量采用了这种DLL机制&#xff0c;甚至…

iOS下JS与OC互相调用(一)--UIWebView 拦截URL

1.在JS 中做一次URL跳转&#xff0c;然后在OC中拦截跳转。&#xff08;这里分为UIWebView 和 WKWebView两种&#xff0c;去年因为还要兼容iOS 6&#xff0c;所以没办法只能采用UIWebView来做。&#xff09;2.利用WKWebView 的MessageHandler。3.利用系统库JavaScriptCore&#…

AI换脸鉴别率超99.6%,微软用技术应对虚假信息

来源 | 微软亚洲研究院AI头条&#xff08;ID:MSRAsia&#xff09;近日社交网络上爆红的一款换脸应用&#xff0c;让许多普通用户体验到了跟爱豆同框、与偶像飙戏的快乐&#xff0c;也因数据使用带来的问题陷入了舆论的漩涡——除了用户隐私保障&#xff0c;如何辨别和处理换脸应…

使用Apache Tiles3.x构建界面布局(一)

Tiles是一个免费的开源模板Java应用程序的框架。基于复合模式简化的用户界面的构建。对于复杂的网站仍是最简单、最优雅的方式与任何MVC技术一起工作。Struts2对Tiles提供了支持&#xff0c;如今Tiles发展已有13个年头&#xff0c;成为Apache的一个独立项目&#xff0c;我们可以…

iOS下JS与OC互相调用(二)--WKWebView 拦截URL

在上篇文章中讲述了使用UIWebView拦截URL的方式来处理JS与OC交互。 由于UIWebView比较耗内存&#xff0c;性能上不太好&#xff0c;而苹果在iOS 8中推出了WKWebView。 同样的用WKWebView也可以拦截URL&#xff0c;做JS 与OC交互。关于WKWebView与UIWebView的对比&#xff0c;大…

基于模型的强化学习比无模型的强化学习更好?错!

作者 | Carles Gelada and Jacob Buckman编辑 | DeepRL来源 | 深度强化学习实验室&#xff08;ID:Deep-RL)【导读】许多研究人员认为&#xff0c;基于模型的强化学习&#xff08;MBRL&#xff09;比无模型的强化学习&#xff08;MFRL&#xff09;具有更高的样本效率。但是&…

程序员的自我修养--链接、装载与库笔记:内存

1. 程序的内存布局 现代的应用程序都运行在一个内存空间里&#xff0c;在32位的系统里&#xff0c;这个内存空间拥有4GB(2的32次方)的寻址能力。应用程序可以直接使用32位的地址进行寻址&#xff0c;这被称为平坦(flat)的内存模型。在平坦的内存模型中&#xff0c;整个内存是一…

【Away3D代码解读】(四):主要模块简介

数据模块&#xff1a; Away3D中最核心的数据类是Mesh类&#xff0c;我们先看看Mesh类的继承关系&#xff1a; NamedAssetBase&#xff1a;为对象提供id和name属性&#xff0c;是Away3D大部分类的基类&#xff1b; Object3D&#xff1a;3D对象基类&#xff0c;提供方便操作3D对象…

程序员的自我修养--链接、装载与库笔记:运行库

1. 入口函数和程序初始化 程序从main开始吗&#xff1f;&#xff1a;操作系统装载程序之后&#xff0c;首先运行的代码并不是main的第一行&#xff0c;而是某些别的代码&#xff0c;这些代码负责准备好main函数执行所需要的环境&#xff0c;并且负责调用main函数&#xff0c;这…

iOS下JS与OC互相调用(三)--MessageHandler

使用WKWebView的时候&#xff0c;如果想要实现JS调用OC方法&#xff0c;除了拦截URL之外&#xff0c;还有一种简单的方式。那就是利用WKWebView的新特性MessageHandler来实现JS调用原生方法。 MessageHandler 是什么&#xff1f; WKWebView 初始化时&#xff0c;有一个参数叫…

北大教授张大庆:无线感知,让你变老也优雅

受访者 | 张大庆记者 | 胡巍巍出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;在国内高校中&#xff0c;北大的校庆日很特殊——5月4日。这一天&#xff0c;也是青年节。北大&#xff0c;是五四运动的策源地。100年来&#xff0c;“爱国、进步、民主、科学”的五四…