已經很長一段時間沒有更新博客了,今天寫了個彈出框,主要用於SDK裡面
現貼出來分享下:
#import@interface SYTipView : NSObject + (SYTipView *)shareInstance; - (void)showSuccessTipWithText:(NSString *)tipText; - (void)showErrorTipWithText:(NSString *)tipText; - (void)startWithText:(NSString *)tipText; - (void)dismissSuccessWithText:(NSString *)tipText block:(void(^)())action; - (void)dismissErrorWithText:(NSString *)tipText block:(void(^)())action; @end
#import "SYTipView.h" #define KEYWINDOW [UIApplication sharedApplication].keyWindow #define GetKeyWindow KEYWINDOW ? KEYWINDOW : [[UIApplication sharedApplication].windows objectAtIndex:0] #define TIPVIEW_WIDTH 100 #define TIPIMAGEVIEW_WIDTH 30 static SYTipView *syTipView = nil; @interface SYTipView ()@property (nonatomic, strong) UIActivityIndicatorView *activityIndicatorView; @property (nonatomic, strong) UITextView *tipTextView; @property (nonatomic, strong) UIViewController *tipViewController; @property (nonatomic, strong) UIView *tipBgView; @property (nonatomic, strong) UIImageView *rightImageView; @property (nonatomic, strong) UIImageView *wrongImageView; @property (nonatomic, assign) BOOL isDisplaying; //限制不能重復點 @end @implementation SYTipView + (SYTipView *)shareInstance { static dispatch_once_t oneceToken; dispatch_once(&oneceToken, ^{ syTipView = [[[self class] alloc] init]; }); return syTipView; } - (id)init { self = [super init]; if (self) { UIWindow *keyWindow = GetKeyWindow; if (_tipViewController == nil) { _tipViewController = [[UIViewController alloc] init]; [_tipViewController.view setFrame:CGRectMake(0, 0, TIPVIEW_WIDTH, TIPVIEW_WIDTH)]; _tipViewController.view.center = CGPointMake(keyWindow.rootViewController.view.bounds.size.width * 0.5f, keyWindow.rootViewController.view.bounds.size.height * 0.5f); _tipViewController.view.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; } if (_activityIndicatorView == nil) { _activityIndicatorView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0 , 0, TIPVIEW_WIDTH, TIPVIEW_WIDTH)]; _activityIndicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; _activityIndicatorView.backgroundColor = [UIColor grayColor]; _activityIndicatorView.alpha = 0.5; _activityIndicatorView.layer.cornerRadius = 10; } if (_tipBgView == nil) { _tipBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, TIPVIEW_WIDTH, TIPVIEW_WIDTH)]; _tipBgView.layer.cornerRadius = 10; _tipBgView.backgroundColor = [UIColor grayColor]; _tipBgView.alpha = 0.5; } if (_rightImageView == nil) { NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"SYTipView" ofType:@"bundle"]; NSBundle *bundle = [NSBundle bundleWithPath:bundlePath]; NSString *imagePath = [bundle pathForResource:@"images/SY_arrow" ofType:@"png"]; _rightImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:imagePath]]; // NSString *const MJRefreshBundleName = @"SYTipView.bundle"; // NSString *path = [MJRefreshBundleName stringByAppendingPathComponent:@"images/SY_arrow.png"]; // UIImage *a = [UIImage imageNamed:path]; // _rightImageView = [[UIImageView alloc] initWithImage:a]; [_rightImageView setFrame:CGRectMake(0, 0, TIPIMAGEVIEW_WIDTH, TIPIMAGEVIEW_WIDTH)]; _rightImageView.center = CGPointMake(_tipViewController.view.bounds.size.width / 2, _tipViewController.view.bounds.size.height - 64); } if (_wrongImageView== nil) { NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"SYTipView" ofType:@"bundle"]; NSBundle *bundle = [NSBundle bundleWithPath:bundlePath]; NSString *imagePath = [bundle pathForResource:@"images/SY_wrong" ofType:@"png"]; _wrongImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:imagePath]]; [_wrongImageView setFrame:CGRectMake(0, 0, TIPIMAGEVIEW_WIDTH, TIPIMAGEVIEW_WIDTH)]; _wrongImageView.center = CGPointMake(_tipViewController.view.bounds.size.width / 2, _tipViewController.view.bounds.size.height - 64); } } return self; } #pragma mark - 構造TipTextView - (void)createTipTextView:(NSString *)tipText { //文字提示 _tipTextView = [[UITextView alloc] initWithFrame:CGRectMake(0 , 0, TIPVIEW_WIDTH, TIPVIEW_WIDTH)]; //讓文字垂直居中 _tipTextView.delegate = self; [_tipTextView addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:nil]; _tipTextView.textAlignment = NSTextAlignmentCenter; _tipTextView.font = [UIFont boldSystemFontOfSize:14]; _tipTextView.backgroundColor = [UIColor clearColor]; _tipTextView.textColor = [UIColor whiteColor]; _tipTextView.userInteractionEnabled = NO; _tipTextView.text = tipText; } //#pragma mark - // //- (void)showTipWithText:(NSString *)tipText //{ // UIWindow *keyWindow = GetKeyWindow; // // _tipViewController.view.center = CGPointMake(keyWindow.rootViewController.view.bounds.size.width * 0.5f, keyWindow.rootViewController.view.bounds.size.height * 0.5f); // [_tipViewController.view addSubview:_activityIndicatorView]; // // [self createTipTextView:tipText]; // [_tipViewController.view addSubview:_tipTextView]; // // [keyWindow.rootViewController.view addSubview:_tipViewController.view]; //// [_activityIndicatorView startAnimating]; // // [self performSelector:@selector(dismissTipView) withObject:nil afterDelay:1]; //} //#pragma mark - 顯示正確信息提示 // //- (void)dismissTipView //{ // [_activityIndicatorView stopAnimating]; // [_activityIndicatorView removeFromSuperview]; // [_tipTextView removeFromSuperview]; // [_tipViewController.view removeFromSuperview]; //} #pragma mark - 顯示正確信息提示 - (void)showSuccessTipWithText:(NSString *)tipText { if (_isDisplaying) { return; } _isDisplaying = YES; UIWindow *keyWindow = GetKeyWindow; _tipViewController.view.center = CGPointMake(keyWindow.rootViewController.view.bounds.size.width * 0.5f, keyWindow.rootViewController.view.bounds.size.height * 0.5f); [_tipBgView addSubview:_rightImageView]; [self createTipTextView:tipText]; [_tipBgView addSubview:_tipTextView]; [_tipViewController.view addSubview:_tipBgView]; [keyWindow.rootViewController.view addSubview:_tipViewController.view]; [self performSelector:@selector(removeSuccessTipView) withObject:nil afterDelay:1]; } - (void)removeSuccessTipView { [_rightImageView removeFromSuperview]; [_tipTextView removeFromSuperview]; _tipTextView = nil; [_tipBgView removeFromSuperview]; [_tipViewController.view removeFromSuperview]; _isDisplaying = NO; } #pragma mark - 顯示錯誤信息提示 - (void)showErrorTipWithText:(NSString *)tipText { if (_isDisplaying) { return; } _isDisplaying = YES; UIWindow *keyWindow = GetKeyWindow; _tipViewController.view.center = CGPointMake(keyWindow.rootViewController.view.bounds.size.width * 0.5f, keyWindow.rootViewController.view.bounds.size.height * 0.5f); [_tipBgView addSubview:_wrongImageView]; [self createTipTextView:tipText]; [_tipBgView addSubview:_tipTextView]; [_tipViewController.view addSubview:_tipBgView]; [keyWindow.rootViewController.view addSubview:_tipViewController.view]; [self performSelector:@selector(removeErrorTipView) withObject:nil afterDelay:1]; } - (void)removeErrorTipView { [_wrongImageView removeFromSuperview]; [_tipTextView removeFromSuperview]; _tipTextView = nil; [_tipBgView removeFromSuperview]; [_tipViewController.view removeFromSuperview]; _isDisplaying = NO; } #pragma mark - 開始提示 - (void)startWithText:(NSString *)tipText; { if (_isDisplaying) { return; } _isDisplaying = YES; UIWindow *keyWindow = GetKeyWindow; _tipViewController.view.center = CGPointMake(keyWindow.rootViewController.view.bounds.size.width * 0.5f, keyWindow.rootViewController.view.bounds.size.height * 0.5f); [_tipViewController.view addSubview:_activityIndicatorView]; [self createTipTextView:tipText]; [_tipViewController.view addSubview:_tipTextView]; [keyWindow.rootViewController.view addSubview:_tipViewController.view]; [_activityIndicatorView startAnimating]; } #pragma mark - 關閉有回調的成功提示 - (void)dismissSuccessWithText:(NSString *)tipText block:(void(^)())action { [_activityIndicatorView stopAnimating]; [_activityIndicatorView removeFromSuperview]; [_tipBgView addSubview:_rightImageView]; [_tipTextView removeFromSuperview]; _tipTextView = nil; [self createTipTextView:tipText]; [_tipBgView addSubview:_tipTextView]; [_tipViewController.view addSubview:_tipBgView]; [self performSelector:@selector(removeSuccessTipViewAction:) withObject:action afterDelay:1]; } - (void)removeSuccessTipViewAction:(void(^)())action { [_tipTextView removeFromSuperview]; _tipTextView = nil; [_rightImageView removeFromSuperview]; [_tipBgView removeFromSuperview]; [_tipViewController.view removeFromSuperview]; action(); _isDisplaying = NO; } #pragma mark - 關閉有回調的失敗提示 - (void)dismissErrorWithText:(NSString *)tipText block:(void(^)())action { [_activityIndicatorView stopAnimating]; [_activityIndicatorView removeFromSuperview]; [_tipBgView addSubview:_wrongImageView]; [_tipTextView removeFromSuperview]; _tipTextView = nil; [self createTipTextView:tipText]; [_tipBgView addSubview:_tipTextView]; [_tipViewController.view addSubview:_tipBgView]; [self performSelector:@selector(removeErrorTipViewAction:) withObject:action afterDelay:1]; } - (void)removeErrorTipViewAction:(void(^)())action { [_tipTextView removeFromSuperview]; _tipTextView = nil; [_wrongImageView removeFromSuperview]; [_tipBgView removeFromSuperview]; [_tipViewController.view removeFromSuperview]; action(); _isDisplaying = NO; } //- (void)dismissTipViewAction:(void(^)())action //{ // [_activityIndicatorView stopAnimating]; // [_activityIndicatorView removeFromSuperview]; // [_tipTextView removeFromSuperview]; // [_tipViewController.view removeFromSuperview]; // action(); //} //- (void)dismissWithText:(NSString *)tipText block:(void(^)())action //{ // _tipTextView.text = tipText; // // [self performSelector:@selector(dismissTipViewAction:) withObject:action afterDelay:1]; //} #pragma mark - 文本垂直居中對齊或底部居中對齊KVC - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { UITextView *tempTextView = object; // //垂直居中對齊 // CGFloat topCorrect = (tempTextView.bounds.size.height - tempTextView.contentSize.height * tempTextView.zoomScale) / 2; // topCorrect = topCorrect < 0.0 ? 0.0 : topCorrect; // tempTextView.contentOffset = (CGPoint){.x = 0, .y = -topCorrect}; // Bottom vertical alignment CGFloat topCorrect = ([tempTextView bounds].size.height - [tempTextView contentSize].height); topCorrect = (topCorrect < 0.0 ? 0.0 : topCorrect); tempTextView.contentOffset = (CGPoint){.x = 0, .y = -topCorrect}; [tempTextView removeObserver:self forKeyPath:@"contentSize" context:nil]; } @end