從零開始設計搭建ios App框架(九)

遮罩層設計


首先看兩個設計

E0C3E5AE-A5DC-482B-8F20-7F88011CA259.png
F023E267-158F-41DA-B087-535A533877C5.png

類似這種彈出層,我相信App里面或多或少都會出現,可能是彈出提示內容,也有可能是彈出多個菜單選項。
其實實現方式都一樣,在一個半透明的View上添加所需要展示的內容。
其實沒什么要說的,直接上代碼吧!

@interface PGPopupView : UIView

/*
 創建popview,子視圖由block回調實現自定義樣式
 */
- (id)initWithContent:(UIView * (^)(id target, SEL closeSEL))contentBlock;
/*
 添加到view上并顯示
 */
- (void)showInView:(UIView *)view;
/*
 關閉
 */
- (void)closeView;

@end

PGPopupView.m

@interface PGPopupView ()<UIGestureRecognizerDelegate>
@property(nonatomic, strong)UIView *contentView;
@property(nonatomic, assign)CGFloat contentHeight;
@property(nonatomic, assign)CGFloat contentWidth;
@property(nonatomic, copy)UIView *(^mContentBlock)(id target, SEL closeSEL);
@end

@implementation PGPopupView

- (id)initWithContent:(UIView * (^ __nonnull)(id target, SEL closeSEL))contentBlock
{
    if(self = [super init])
    {
        self.mContentBlock = contentBlock;
        
        self.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREENH_HEIGHT);
        self.backgroundColor = ColorFromRGBA(160, 160, 160, 0);
        
        [self createSubViews];
        
        [self animeData];
    }
    return self;
}

- (void)animeData
{
    //self.userInteractionEnabled = YES;
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedCancel)];
    [self addGestureRecognizer:tapGesture];
    tapGesture.delegate = self;
    
    __weak PGPopupView *weakSelf = self;
    [UIView animateWithDuration:.25 animations:^{
        weakSelf.backgroundColor = UIColorFromRGBA(0x000000, 0.7);
        [UIView animateWithDuration:.25 animations:^{
            
            weakSelf.contentView.frame = CGRectMake((self.frame.size.width-self.contentWidth)/2, (self.frame.size.height-self.contentHeight)/2, self.contentWidth, self.contentHeight);
        }];
    } completion:^(BOOL finished) {
    }];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if([touch.view isKindOfClass:[self class]])
    {
        return YES;
    }
    return NO;
}

- (void)tappedCancel
{
    __weak PGPopupView *weakSelf = self;
    [UIView animateWithDuration:.25 animations:^{
        [weakSelf.contentView setFrame:CGRectMake(self.frame.size.width/2, self.frame.size.height/2, 0, 0)];
        weakSelf.alpha = 0;
    } completion:^(BOOL finished) {
        if (finished)
        {
            [weakSelf removeFromSuperview];
        }
    }];
}

- (void)showInView:(UIView *)view
{
    if(view==nil){
        [[UIApplication sharedApplication].delegate.window.rootViewController.view addSubview:self];
    }else{
        [view addSubview:self];
    }
}

- (void)closeView
{
    [self tappedCancel];
}

/////////////////
#pragma mark -
- (void)createSubViews
{
    if(!self.contentView) {
        if(self.mContentBlock) {
            self.contentView = self.mContentBlock(self, @selector(closeView));
            self.contentHeight = self.contentView.frame.size.height;
            self.contentWidth = self.contentView.frame.size.width;
            self.contentView.frame = CGRectZero;
        } else {
            self.contentView = [[UIView alloc] initWithFrame:CGRectZero];
            self.contentHeight = 0;
        }
        self.contentView.clipsToBounds = YES;
        self.contentView.frame = CGRectMake(self.frame.size.width/2, self.frame.size.height/2, 0, 0);
        [self addSubview:self.contentView];
    }
}

@end

調用示例:

        WEAKSELF
        PGPopupView *view = [[PGPopupView alloc] initWithContent:^UIView * (id target, SEL closeSEL){
            UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, weakSelf.view.frame.size.width-2*PGHeightWith1080(60), PGHeightWith1080(960))];
            contentView.backgroundColor = UIColorFromRGBA(0xff00ff, 1.0);
            
            UIButton *closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            closeBtn.frame = CGRectMake(contentView.frame.size.width-PGHeightWith1080(120), PGHeightWith1080(60), PGHeightWith1080(90), PGHeightWith1080(90));
            [closeBtn setBackgroundImage:[UIImage imageNamed:@"icon_close"] forState:UIControlStateNormal];
            [closeBtn addTarget:target action:closeSEL forControlEvents:UIControlEventTouchUpInside];
            [contentView addSubview:closeBtn];
            
            //可以自定義界面
            
            return contentView;
        }];
        [view showInView:nil];

這篇沒有什么多說的,就這樣吧?。。?/p>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容