From 4f647276ec8e3e97451d83752fb21682b44b9e69 Mon Sep 17 00:00:00 2001 From: Rakuyo Date: Sat, 23 Sep 2017 18:03:45 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E4=B8=8E=E6=BB=91=E5=8A=A8=E6=89=8B=E5=8A=BF=EF=BC=8C=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E7=82=B9=E5=87=BB=E4=B8=8E=E5=90=91=E4=B8=8A=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E6=A8=AA=E5=B9=85=E5=8F=AF=E4=BB=A5=E4=BB=A4=E6=A8=AA?= =?UTF-8?q?=E5=B9=85=E6=B6=88=E5=A4=B1=E5=95=A6=E3=80=82=202.=20=E5=9C=A8.?= =?UTF-8?q?h=E6=96=87=E4=BB=B6=E4=B8=AD=E6=9A=B4=E9=9C=B23=E4=B8=AA?= =?UTF-8?q?=E5=AE=8F=E5=AE=9A=E4=B9=89=EF=BC=8C=E6=96=B9=E4=BE=BF=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BD=BF=E7=94=A8=E3=80=82=203.=20=E6=9A=B4=E9=9C=B2?= =?UTF-8?q?=E5=8D=95=E4=BE=8B=E6=96=B9=E6=B3=95=EF=BC=8C=E6=8F=90=E4=BE=9B?= =?UTF-8?q?1=E4=B8=AA=E7=94=A8=E4=BA=8E=E8=AE=BE=E7=BD=AE=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E7=9A=84=E5=AF=B9=E8=B1=A1=E6=96=B9=E6=B3=95=E3=80=82?= =?UTF-8?q?=204.=20=E6=9A=B4=E9=9C=B2=E5=BC=B9=E5=87=BA=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E7=AA=97=E4=B8=8E=E9=9A=90=E8=97=8F=E6=8F=90=E7=A4=BA=E7=AA=97?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.md | 16 +- RKOTopAlertManager/README.md | 84 ++++++++-- RKOTopAlertManager/RKOTopAlert.podspec | 4 +- .../RKOTopAlert/RKOTopAlert/RKOTopAlert.h | 56 ++++++- .../RKOTopAlert/RKOTopAlert/RKOTopAlert.m | 156 +++++++++++++----- 6 files changed, 250 insertions(+), 67 deletions(-) diff --git a/.gitignore b/.gitignore index bd0b524..f9190a1 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ fastlane/test_output iOSInjectionProject/ RKOTextViewManager/.Archive/README.md .Archive/README.md +RKOTopAlertManager/.Archive/README.md diff --git a/README.md b/README.md index f201b66..6c77540 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ ### RKOTextView

- + @@ -78,7 +78,7 @@ ### RKOTopAlert

- + @@ -89,7 +89,7 @@ #### 集成: ```shell - pod 'RKOTopAlert', '~> 1.0.0' + pod 'RKOTopAlert', '~> 1.0.1' ``` #### 使用: @@ -98,6 +98,16 @@ [RKOTopAlert popAlertViewWithText:@"提醒文字" textColor:[UIColor redColor] ackgroundColor:[UIColor blackColor]; ``` +或者: + +```objc +// 创建单例并设置样式。 +RKOTopAlert *topAlert = [[self sharedManager] alertViewWithText:@"提醒文字" textColor:[UIColor whiteColor] ackgroundColor:[UIColor redColor]]; + +// 出现 +[topAlert alertAppearWithDuration:0.3f]; +``` + --------------------------------------------------------------------- ## RKOTools diff --git a/RKOTopAlertManager/README.md b/RKOTopAlertManager/README.md index a0ef8b7..068dcc0 100644 --- a/RKOTopAlertManager/README.md +++ b/RKOTopAlertManager/README.md @@ -1,9 +1,7 @@ # RKOTopAlert -自定义一个顶端的`Alert`提示窗。 -

- + @@ -11,33 +9,46 @@ ## 简介 -自定义一个顶端的`Alert`提示窗。弹出时从顶端向下移动。 - +自定义一个顶端的`Alert`提示窗。弹出时从顶端向下移动。(**在iPhone X下可用**) 可以设置**提示文字**、**文字颜色**、**背景颜色**。 **高度**为`Status` + `NavigationBar`的高度。(不论您的`ViewController`是否添加到`NavigationController`中) -注意:该控件有以下几点**未进行测试**: -1. 编写时考虑到了自定义`NavigationBar`,但因为时间原因未进行测试。 -2. 自定义`NavigationBar`,但自定义`NavigationBar`隐藏时的效果。 -3. 原生`NavigationBar`隐藏时的情况。 -3. 隐藏`Status`时的效果。 +- 注意:该控件有以下几点**未进行测试**: + 1. 编写时考虑到了自定义`NavigationBar`,但因为时间原因未进行测试。 + 2. 自定义`NavigationBar`,但自定义`NavigationBar`隐藏时的效果。 + 3. 原生`NavigationBar`隐藏时的情况。 + 4. 隐藏`Status`时的效果。 如果在您的项目中用到了以上几点未测试的功能,请将您的结果告诉我,帮助我完善该控件。 +## 已知问题 + +该控件还**未做自动布局**,故在横屏下会出现问题。 + ## 集成 ```shell - pod 'RKOTopAlert', '~> 1.0.0' + pod 'RKOTopAlert', '~> 1.0.1' ``` ## 使用 -在需要弹出该提示窗的地方调用下面的方法 +在需要弹出该提示窗的地方调用下面的方法: + +```objc +[RKOTopAlert popAlertViewWithText:@"提醒文字" textColor:[UIColor whiteColor] ackgroundColor:[UIColor redColor]; +``` + +如果您的`App`需要统一多个提示窗的样式,那么推荐您使用下面的方法: ```objc -[RKOTopAlert popAlertViewWithText:@"提醒文字" textColor:[UIColor redColor] ackgroundColor:[UIColor blackColor]; +// 创建单例并设置样式。 +RKOTopAlert *topAlert = [[self sharedManager] alertViewWithText:@"提醒文字" textColor:[UIColor whiteColor] ackgroundColor:[UIColor redColor]]; + +// 出现 +[topAlert alertAppearWithDuration:0.3f]; ``` ## 接口 @@ -46,12 +57,12 @@ ```objc /** - 设置提示窗的样式 + * 设置提示窗的样式,并弹出提示窗。(其对象参数均不可为nil。) - @param text 提示窗显示文字,不能为nil。为空则设置无效。 - @param textColor 文字颜色 - @param backgroundColor 提示窗背景颜色 - @param duration 横幅持续显示的时间 + * @param text 提示窗显示文字。 + * @param textColor 文字颜色。 + * @param backgroundColor 提示窗背景颜色。 + * @param duration 横幅持续显示的时间。 */ + (void)popAlertViewWithText:(NSString *)text textColor:(UIColor *)textColor @@ -59,3 +70,40 @@ duration:(CGFloat)duration; ``` +此外,考虑到您可以需要统一的设置多个弹窗,我们提供如下的方法进行设置: + +```objc +/** + * 单例方法,创建对象。 + + * @return 提示窗Alert。 + */ ++ (RKOTopAlert *)sharedManager; + +/** + * 设置样式。(其对象参数均不可为nil。) + + * @param text 提示窗显示文字。 + * @param textColor 文字颜色。 + * @param backgroundColor 提示窗背景颜色。 + */ +- (void)alertViewWithText:(NSString *)text + textColor:(UIColor *)textColor + ackgroundColor:(UIColor *)backgroundColor; +``` + +此外,我们分别提供了弹窗弹窗的**弹出**方法与**消失**方法,方便您在他处动态地控制弹窗的弹出与消失: + +```objc +/** + * 弹出提示窗的方法。 + + * @param duration 横幅持续显示的时间。 + */ +- (void)alertAppearWithDuration:(CGFloat)duration; + +/** + * 令顶部提示窗消失的方法。 + */ +- (void)alertDisappear; +``` diff --git a/RKOTopAlertManager/RKOTopAlert.podspec b/RKOTopAlertManager/RKOTopAlert.podspec index 232e556..1c6ed51 100644 --- a/RKOTopAlertManager/RKOTopAlert.podspec +++ b/RKOTopAlertManager/RKOTopAlert.podspec @@ -9,7 +9,7 @@ Pod::Spec.new do |s| s.name = "RKOTopAlert" - s.version = "1.0.0" + s.version = "1.0.1" s.summary = "Appears at the top of the notification view" s.description = <<-DESC Appears at the top of the notification view @@ -23,7 +23,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = "7.0" - s.source = { :git => "https://github.com/rakuyoMo/RKOControls.git", :tag => "1.0.0" } # #{s.version} + s.source = { :git => "https://github.com/rakuyoMo/RKOControls.git", :tag => "1.0.4" } # #{s.version} s.requires_arc = true diff --git a/RKOTopAlertManager/RKOTopAlert/RKOTopAlert/RKOTopAlert/RKOTopAlert.h b/RKOTopAlertManager/RKOTopAlert/RKOTopAlert/RKOTopAlert/RKOTopAlert.h index e8e7b73..518b281 100644 --- a/RKOTopAlertManager/RKOTopAlert/RKOTopAlert/RKOTopAlert/RKOTopAlert.h +++ b/RKOTopAlertManager/RKOTopAlert/RKOTopAlert/RKOTopAlert/RKOTopAlert.h @@ -8,19 +8,63 @@ #import +// 弹出动画的持续时间。 +#define ALERT_APPEAR_ANIMATE_DURATION 0.4f +// 消失动画的持续时间。 +#define ALERT_DISAPPEAR_ANIMATE_DURATION 0.3f +// 提示文字的字体大小。 +#define FONTSIZE 20 + +NS_ASSUME_NONNULL_BEGIN + @interface RKOTopAlert : UIView +#pragma mark - 分别设置每个弹窗样式。 /** - 设置提示窗的样式 - - @param text 提示窗显示文字,不能为nil。为空则设置无效。 - @param textColor 文字颜色 - @param backgroundColor 提示窗背景颜色 - @param duration 横幅持续显示的时间 + * 设置提示窗的样式,并弹出提示窗。(其对象参数均不可为nil。) + + * @param text 提示窗显示文字。 + * @param textColor 文字颜色。 + * @param backgroundColor 提示窗背景颜色。 + * @param duration 横幅持续显示的时间。 */ + (void)popAlertViewWithText:(NSString *)text textColor:(UIColor *)textColor ackgroundColor:(UIColor *)backgroundColor duration:(CGFloat)duration; +#pragma mark - 统一设置App所有弹窗样式 +/** + * 单例方法,创建对象。 + + * @return 提示窗Alert。 + */ ++ (RKOTopAlert *)sharedManager; + +/** + 设置样式。(其对象参数均不可为nil。) + + @param text 提示窗显示文字。 + @param textColor 文字颜色。 + @param backgroundColor 提示窗背景颜色。 + */ +- (void)alertViewWithText:(NSString *)text + textColor:(UIColor *)textColor + ackgroundColor:(UIColor *)backgroundColor; + +/** + * 弹出提示窗的方法。 + + * @param duration 横幅持续显示的时间。 + */ +- (void)alertAppearWithDuration:(CGFloat)duration; + +/** + * 令顶部提示窗消失的方法。 + */ +- (void)alertDisappear; + @end + +NS_ASSUME_NONNULL_END + diff --git a/RKOTopAlertManager/RKOTopAlert/RKOTopAlert/RKOTopAlert/RKOTopAlert.m b/RKOTopAlertManager/RKOTopAlert/RKOTopAlert/RKOTopAlert/RKOTopAlert.m index d78dbe4..17bbb4e 100644 --- a/RKOTopAlertManager/RKOTopAlert/RKOTopAlert/RKOTopAlert/RKOTopAlert.m +++ b/RKOTopAlertManager/RKOTopAlert/RKOTopAlert/RKOTopAlert/RKOTopAlert.m @@ -8,12 +8,26 @@ #import "RKOTopAlert.h" +// 记录高度的结构体。 struct { CGFloat statusbarH; CGFloat navigationH; CGFloat alertViewH; } topHight; +@interface RKOTopAlert() + +// 提示文字。 +@property (nonatomic, copy) NSString *text; + +// 文字的颜色。 +@property (nonatomic, strong) UIColor *textColor; + +// 标记视图已经出现 +@property (nonatomic, assign) BOOL alertDidAppear; + +@end + @implementation RKOTopAlert #pragma mark - sharedManager @@ -41,73 +55,139 @@ + (RKOTopAlert *)sharedManager { // 初始化提示窗,并设置Frame instance = [[self alloc] initWithFrame:CGRectMake(0, -topHight.alertViewH, vc.navigationBar.frame.size.width, topHight.alertViewH)]; + + // 添加点击及滑动手势 + [instance addGestureRecognizer]; }); return instance; } -// 弹出提示窗 -+ (void)popAlertViewWithText:(NSString *)text textColor:(UIColor *)textColor ackgroundColor:(UIColor *)backgroundColor duration:(CGFloat)duration{ - - // 判断alert是否存在,及是否设置了提示文字 - if (!text || [self sharedManager].superview ) { - return; - } +// 设置样式并提示窗 ++ (void)popAlertViewWithText:(NSString *)text textColor:(UIColor *)textColor ackgroundColor:(UIColor *)backgroundColor duration:(CGFloat)duration { // 创建单例 RKOTopAlert *topAlert = [self sharedManager]; + // 设置样式 + [topAlert alertViewWithText:text textColor:textColor ackgroundColor:backgroundColor]; + + // 出现 + [topAlert alertAppearWithDuration:duration]; +} + +// 设置样式。 +- (void)alertViewWithText:(NSString *)text textColor:(UIColor *)textColor ackgroundColor:(UIColor *)backgroundColor { + // 设置背景颜色。 - topAlert.backgroundColor = backgroundColor; + self.backgroundColor = backgroundColor; + + // 设置文字颜色。 + self.textColor = textColor; + + // 设置提示内容。 + self.text = text; +} + +#pragma mark - Set && Get +- (void)setText:(NSString *)text { + _text = text; // 设置显示文字。 UILabel *alertLabel = [[UILabel alloc] init]; alertLabel.text = text; - alertLabel.textColor = textColor; - alertLabel.font = [UIFont boldSystemFontOfSize:20]; + alertLabel.textColor = _textColor; + alertLabel.font = [UIFont boldSystemFontOfSize:FONTSIZE]; alertLabel.backgroundColor = [UIColor clearColor]; // 水平居中 alertLabel.textAlignment = NSTextAlignmentCenter; - alertLabel.frame = CGRectMake(0, topHight.statusbarH, topAlert.frame.size.width, topHight.navigationH); + alertLabel.frame = CGRectMake(0, topHight.statusbarH, self.frame.size.width, topHight.navigationH); // 添加视图 - [topAlert addSubview:alertLabel]; + [self addSubview:alertLabel]; +} + +#pragma mark - Animate +// 出现的动画 +- (void)alertAppearWithDuration:(CGFloat)duration { + + // 如果已经被添加,则不再出现。 + if (self.superview) { + return; + } UIWindow *keyWindow = [UIApplication sharedApplication].delegate.window; - [keyWindow addSubview:topAlert]; + [keyWindow addSubview:self]; // 显示到最上层。 - [keyWindow bringSubviewToFront:topAlert]; + [keyWindow bringSubviewToFront:self]; - __block CGRect alertFrame = topAlert.frame; - [UIView animateWithDuration:0.4f animations:^{ + __block CGRect alertFrame = self.frame; + [UIView animateWithDuration:ALERT_APPEAR_ANIMATE_DURATION animations:^{ // 向下移动,显示提示窗。 alertFrame.origin.y = 0; - topAlert.frame = alertFrame; + self.frame = alertFrame; } completion:^(BOOL finished) { // 显示动画完成 - - // duration秒后横幅自动消失 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + if (finished) { + self.alertDidAppear = YES; - //移除横幅动画,设置完全透明并从父视图中移除 - [UIView animateWithDuration:0.3f - animations:^{ - // 向上移动消失。 - alertFrame.origin.y = -topHight.alertViewH; - topAlert.frame = alertFrame; - } - completion:^(BOOL finished) { - - if (finished) { - alertLabel.text = nil; - alertLabel.textColor = nil; - topAlert.backgroundColor = nil; - // 从父视图中移除。 - [topAlert removeFromSuperview]; - } - }]; - }); + // duration秒后横幅自动消失 + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + + // 消失。 + [self alertDisappear]; + }); + } }]; } +// 消失的动画。 +- (void)alertDisappear { + + if (!self.alertDidAppear) { + return; + } + + __block CGRect alertFrame = self.frame; + //移除横幅动画,设置完全透明并从父视图中移除 + [UIView animateWithDuration:ALERT_DISAPPEAR_ANIMATE_DURATION + animations:^{ + // 向上移动消失。 + alertFrame.origin.y = -topHight.alertViewH; + self.frame = alertFrame; + } + completion:^(BOOL finished) { + + if (finished) { + UILabel *alertLabel = self.subviews[0]; + alertLabel.text = nil; + alertLabel.textColor = nil; + self.backgroundColor = nil; + // 从父视图中移除。 + [self removeFromSuperview]; + + self.alertDidAppear = NO; + } + }]; +} + +#pragma mark - GestureRecognizer +// 添加手势 +- (void)addGestureRecognizer { + + // 点击立刻消失 + UITapGestureRecognizer *tapGestRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(alertDisappear)]; + + // 向上滑动消失 + UISwipeGestureRecognizer *swipeGestRec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(alertDisappear)]; + + // 向上滑动 + swipeGestRec.direction = UISwipeGestureRecognizerDirectionUp; + + // 添加手势。 + [self addGestureRecognizer:tapGestRec]; + [self addGestureRecognizer:swipeGestRec]; +} + @end +