iOS弹出View同时使背影变暗
开发时,常常会遇到这种问题,点击按钮A,弹出视图B,同时背影变暗,点击背影视图B消失;
GitHub上有个很好的例子::下载地址
本文内容也截取于其,解决了上述例子中多次快速点击程序崩溃的问题。
附上效果图
弹出视图
代码:
// AddView.h #import <UIKit/UIKit.h> @interface AddSpaceView : UIView<UIGestureRecognizerDelegate> { UIView *parentView; } @property (nonatomic, strong) UIView *parentView; @property (nonatomic, assign) id delegate; - (id)initWithParentView:(UIView *)_parentView; - (void)show; - (void)close; @end
// AddView.m #import "AddView.h" @implementation AddSpaceView @synthesize parentView; @synthesize delegate; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } - (id)initWithParentView:(UIView *)_parentView { self = [super initWithFrame:_parentView.frame]; if (self) { parentView = _parentView; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(oneTap)]; tap.delegate = self; [self addGestureRecognizer:tap]; } return self; } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIButton class]]){ return NO; } return YES; } -(void)show { self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; [parentView addSubview:self]; [UIView animateWithDuration:0.2f delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.4f]; } completion:NULL ]; } - (void)close { [UIView animateWithDuration:0.0f delay:0.0 options:UIViewAnimationOptionTransitionNone animations:^{ self.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.0f]; } completion:^(BOOL finished) { // for (UIView *v in [self subviews]) { // [v removeFromSuperview]; // } [self removeFromSuperview]; } ]; } - (void)oneTap { [delegate closeAddSpaceView:self]; } - (void)closeAddSpaceView: (AddSpaceView *)addSpaceView { [self close]; } /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ @end
用法:
点击按钮时:
- (IBAction)showAddMenu:(id)sender { self.popupView.layer.cornerRadius = 12; self.popupView.layer.rasterizationScale = [[UIScreen mainScreen] scale]; UIWindow *window = [UIApplication sharedApplication].keyWindow; addSpaceView = [[AddSpaceView alloc] initWithParentView:window.rootViewController.view]; self.popupView.center = addSpaceView.center; [addSpaceView setDelegate:self]; [addSpaceView addSubview:self.popupView]; [addSpaceView show]; }