• UIActionSheet完美解决方案


      最近程序中用到了,底部弹出框,看了下,前辈写得代码,搜索了下网路,发现其实都没有很好的解决问题,所以研究了下,将代码分享出来,跟大家分享一下,有问题的话,欢迎各位大牛批评指正。

    最古老的方法一:

    -(void)CreateActionSheet{

        self.actionSheet = [[UIActionSheetallocinitWithTitle:@"选择"delegate:selfcancelButtonTitle:@"cancel"destructiveButtonTitle:nilotherButtonTitles:@"a",@"a",@"a"nil];

        [self.actionSheetaddSubview:self.baseView];

    }

    上面的方法,是在系统的ActionSheet图层上覆盖图层,已达到底部弹出的效果。

    优点:使用简单方便

    缺点: 这个方法无法很好的解决ActionSheet高度问题,没有办法自定

    改进方法二:

    继承UIActionSheet 重写 -(void)layoutSubviews方法。网上有很多这种代码,大家可以去看下。

    优点:实现了ActionSheet的高度自定问题

    缺点:失去了原有ActionSheet中得动画效果,和阴影点击效果

    完美解决三:

    方案一: 在方法二中,补全确实的动画效果和阴影点击效果。问题可以很好的解决,单需要对IOS6和IOS7做不同的处理,因为IOS7时,ActonSheet的父视图有所改变,有兴趣的童鞋可以看看。

         想要代码的可以给我留言。

    方案二:按照IOS7中ActionSheet的原理重新定制。话不多说直接上代码

    #import <UIKit/UIKit.h>
    
    @interface RecreateActionSheet : UIView
    @property (nonatomic,retain) UIButton * baseView;
    @property (nonatomic,retain) UIView * baseActionSheet;
    @property (nonatomic,retain) UIView * contentView;
    @property (nonatomic,retain) UINavigationBar * navBar;
    @property (nonatomic,retain) UINavigationItem * navItem;
    
    -(id)initWithHeight:(CGFloat)_height WithTitle:(NSString *)_title;
    -(void)show;
    -(void)dismiss;
    @end
    #import "RecreateActionSheet.h"
    
    @interface RecreateActionSheet (){
    
        CGRect mainBounds; //主屏幕大小
    //    UIWindow * mainWindow; //主屏幕
        CGRect actionRect1; //初始位置
        CGRect actionRect2; //结束位置
    }
    @end
    
    @implementation RecreateActionSheet
    
    
    -(id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
        }
        return self;
    }
    
    -(id)initWithHeight:(CGFloat)_height WithTitle:(NSString *)_title{
        mainBounds = [UIScreen mainScreen].bounds;
    //    mainWindow = [[UIApplication sharedApplication].windows objectAtIndex:0];
        actionRect1 = CGRectMake(0, mainBounds.size.height, mainBounds.size.width, 0);
        actionRect2 = CGRectMake(0, mainBounds.size.height - _height - 44, mainBounds.size.width, _height + 44);
        self = [super initWithFrame:mainBounds];
        if (self) {
            // Initialization code
            [self createUiWithHeight:_height];
            [self createNavItemWithTitle:_title];
        }
        return self;
    }
    
    -(void)dealloc{
        [self.baseActionSheet release];
        [self.contentView release];
        [self.navBar release];
        [self.navItem release];
        [super dealloc];
    }
    
    -(void)createUiWithHeight:(CGFloat)_height{
        
        _baseView = [UIButton buttonWithType:UIButtonTypeCustom];
        _baseView.frame = mainBounds;
        _baseView.backgroundColor = [UIColor blackColor];
        _baseView.alpha = 0;
        [_baseView addTarget:self action:@selector(dismiss) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:_baseView];
        
        _baseActionSheet = [[UIView alloc] init];
        _baseActionSheet.frame = actionRect1;
        _baseActionSheet.backgroundColor = [UIColor clearColor];
        [self addSubview:_baseActionSheet];
        
        _navBar = [[UINavigationBar alloc] init];
        _navBar.frame = CGRectMake(0, 0, mainBounds.size.width, 44);
        _navBar.barStyle = UIBarStyleBlackOpaque;
        [_baseActionSheet addSubview:_navBar];
        
        
        _contentView = [[UIView alloc] init];
        _contentView.frame = CGRectMake(0, 44, mainBounds.size.width, _height);
        _contentView.backgroundColor = [UIColor whiteColor];
        [_baseActionSheet addSubview:_contentView];
    }
    
    -(void)createNavItemWithTitle:(NSString *)_title{
        _navItem = [[UINavigationItem alloc] initWithTitle:nil];
        UIBarButtonItem * leftButton = [[UIBarButtonItem alloc] initWithTitle:@"取消" style:UIBarButtonItemStyleBordered target:self action:@selector(buttonCancel)];
        UIBarButtonItem * rightButton = [[UIBarButtonItem alloc] initWithTitle:@"确定" style:UIBarButtonItemStyleBordered target:self action:@selector(buttonOk)];
        _navItem.leftBarButtonItem = leftButton;
        _navItem.rightBarButtonItem = rightButton;
        _navItem.title = _title;
        [leftButton release];
        [rightButton release];
        
        [self.navBar setItems:[NSArray arrayWithObject:_navItem]];
    }
    
    #pragma mark 取消和确定按钮事件
    -(void)buttonOk{
        [self dismiss];
    }
    
    -(void)buttonCancel{
        [self dismiss];
    }
    
    #pragma mark 显示和隐藏
    -(void)show{
        [mainWindow addSubview:self];
        [self addAnimationIn];
    }
    
    -(void)dismiss{
        [self addAnimationOut];
    }
    
    
    #pragma mark 显示和隐藏动画
    -(void)addAnimationIn{
        [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^(void){
            self.baseActionSheet.frame = actionRect2;
            self.baseView.alpha = 0.4;
        } completion:^(BOOL finished){}];
    }
    
    -(void)addAnimationOut{
        [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^(void){
            self.baseActionSheet.frame = actionRect1;
            self.baseView.alpha = 0;
        } completion:^(BOOL finished){[self removeFromSuperview];}];
    }
    
    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect
    {
        // Drawing code
    }
    */
    
    @end

    这样一个完美ActionSheet就产生了,童鞋们可以在这个基础上,绘制自己需要的界面,添加自己的委托等等。

    欢迎大家多多交流。。。

  • 相关阅读:
    DockerFile详解--转载
    httpd日志格式
    httpd2.4.6配置文件解释说明
    httpd基于域名虚拟主机配置
    HTTPD三种工作模型
    centos7配置iscsi
    DNS子域授权
    DNS缓存服务器与转发服务器
    函数式编程 pipe之函数柯里化
    typescript安装运行两种方法
  • 原文地址:https://www.cnblogs.com/ggxbq/p/3732142.html
Copyright © 2020-2023  润新知