开发者社区> 问答> 正文

iPhone自定义UIActionSheet

iPhone应用能不能自定义UIActionSheet的样式,默认的那个黑了吧唧太丑了
我看有些应用类似的UIActionSheet很漂亮,他们这种是完全自己实现的,还是框架有什么接口可以调用的?
类似这种:
screenshot

展开
收起
a123456678 2016-07-19 16:53:34 2200 0
2 条回答
写回答
取消 提交回答
  • iOS工程师。

    一般都是自己实现的。建议可以到 github 或者 code4app上面搜搜demo。自己实现一个也比较简单。

    2019-07-17 19:58:33
    赞同 展开评论 打赏
  • 用一个黑色的底做透明度渐变动画,同时底部放按钮的视图做位移动画就可以了。
    另外我建议楼主把翻页控件的贴结了~
    
    .h:
    
    #import <UIKit/UIKit.h>
    
    @class YXPActionSheet;
    
    @protocol YXPActionSheetDelegate <NSObject>
    
    @optional
    - (void)actionSheet:(YXPActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex buttonTitle:(NSString *)title;
    
    @end
    
    @interface YXPActionSheet : UIView
    
    + (YXPActionSheet *)actionSheetWithCancelButtonTitle:(NSString *)cancelTitle
                                destructiveButtonTitle:(NSString *)destructiveButtonTitle
                                     otherButtonTitles:(id)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;
    
    @property (nonatomic,assign) id<YXPActionSheetDelegate> delegate;
    
    - (void)showInView:(UIView *)view;
    
    - (void)showInWindow;
    
    - (void)showInViewFromLeft:(UIView *)view;
    
    - (void)showInWindowFromLeft;
    
    - (void)dismiss;
    
    @end
    .m
    
    //
    //  YXPSheetView.m
    //  YXPiOSClient
    //
    //  Created by openthread on 7/27/12.
    //  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
    //
    
    #import "YXPActionSheet.h"
    
    #define BUTTON_LABEL_TAG 891204
    
    @interface YXPActionSheet()
    
    + (UILabel *)buttonLabelWithText:(NSString *)text;
    - (void)setActionSheetHeight:(CGFloat)height;
    - (void)addButton:(UIButton *)button;
    - (void)resizeButtons;
    - (void)buttonTouched:(UIButton *)button;
    
    @end
    
    @implementation YXPActionSheet
    {
        UIView *_dimmView;
        UIImageView *_sheetBackgroundView;
        NSMutableArray *_buttonArray;
    }
    
    @synthesize delegate = _delegate;
    
    + (YXPActionSheet *)actionSheetWithCancelButtonTitle:(NSString *)cancelTitle
                                  destructiveButtonTitle:(NSString *)destructiveButtonTitle
                                       otherButtonTitles:(id)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION
    {
        YXPActionSheet *sheetView = [[YXPActionSheet alloc] initWithFrame:CGRectZero];
        if(!sheetView) return nil;
        
        NSUInteger buttonIndex = 0;
        
        CGFloat height = 27.0f;
        if (destructiveButtonTitle)
        {
            UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
            button.tag = buttonIndex++;
            button.frame = CGRectMake(0, height - 4.0f, 0.0f, 45.0f);
            [button setBackgroundImage:[[UIImage imageNamed:@"YXPActionSheetDestructiveButton.png"] stretchableImageWithLeftCapWidth:22 topCapHeight:22] forState:UIControlStateNormal];
            UILabel *label = [YXPActionSheet buttonLabelWithText:destructiveButtonTitle];
            [button addSubview:label];
            [sheetView addButton:button];
            height += 59.0f;
        }
        
        va_list args;
        va_start(args, otherButtonTitles);
        for (NSString *arg = otherButtonTitles; arg != nil; arg = va_arg(args, NSString*))
        {
            UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
            button.tag = buttonIndex++;
            button.frame = CGRectMake(0, height - 4.0f, 0.0f, 45.0f);
            [button setBackgroundImage:[[UIImage imageNamed:@"YXPActionSheetButton.png"] stretchableImageWithLeftCapWidth:22 topCapHeight:22] forState:UIControlStateNormal];
            UILabel *label = [YXPActionSheet buttonLabelWithText:arg];
            [button addSubview:label];
            [sheetView addButton:button];
            height += 59.0f;
        }
        va_end(args);
        
        if (cancelTitle)
        {
            UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
            button.tag = buttonIndex++;
            button.frame = CGRectMake(0, height - 4.0f, 0.0f, 45.0f);
            [button setBackgroundImage:[[UIImage imageNamed:@"YXPActionSheetCancelButton.png"] stretchableImageWithLeftCapWidth:22 topCapHeight:22] forState:UIControlStateNormal];
            UILabel *label = [YXPActionSheet buttonLabelWithText:cancelTitle];
            [button addSubview:label];
            [sheetView addButton:button];
            height += 59.0f;
        }
        
        [sheetView setActionSheetHeight:height];
        return sheetView;
    }
    
    - (id)initWithFrame:(CGRect)frame
    {
        CGRect screenRect = [[UIScreen mainScreen] bounds];
        CGSize screenSize = screenRect.size;
        self = [super initWithFrame:(CGRect){CGPointZero,screenSize}];
        if (self)
        {
            _buttonArray = [NSMutableArray array];
            
            _dimmView = [[UIView alloc] initWithFrame:(CGRect){CGPointZero,screenSize}];
            _dimmView.backgroundColor = [UIColor colorWithWhite:0.0f/255.0f alpha:0.5f];
            [super addSubview:_dimmView];
            
            _sheetBackgroundView = [[UIImageView alloc] initWithFrame:frame];
            UIImage *backgroundImage = [UIImage imageNamed:@"YXPActionSheetBackground.png"];
            backgroundImage = [backgroundImage stretchableImageWithLeftCapWidth:40 topCapHeight:40];
            _sheetBackgroundView.userInteractionEnabled = YES;
            _sheetBackgroundView.image = backgroundImage;
            _sheetBackgroundView.userInteractionEnabled = YES;
            [super addSubview:_sheetBackgroundView];
        }
        return self;
    }
    
    - (void)addSubview:(UIView *)view
    {
        [_sheetBackgroundView addSubview:view];
    }
    
    - (void)showInView:(UIView *)view
    {
        [view addSubview:self];
        
        _sheetBackgroundView.transform = CGAffineTransformIdentity;
        
        CGFloat height = _sheetBackgroundView.frame.size.height;
        CGFloat superViewHeight = view.frame.size.height;
        
        _dimmView.alpha = 0;
        _sheetBackgroundView.frame = CGRectMake(0, superViewHeight, view.frame.size.width, height);
        [self resizeButtons];
        [UIView animateWithDuration:0.2 animations:^{
            _dimmView.alpha = 1;
            _sheetBackgroundView.frame = CGRectMake(0, superViewHeight - height, view.frame.size.width, height);
        }];
    }
    
    - (void)showInWindow
    {
        [self showInView:[[[UIApplication sharedApplication] delegate] window]];
    }
    
    - (void)showInViewFromLeft:(UIView *)view
    {
        [view addSubview:self];
        
        CGFloat height = _sheetBackgroundView.frame.size.height;
        CGFloat superViewHeight = view.frame.size.height;
        
        _dimmView.alpha = 0;
    
        CGRect originFrame = CGRectMake(-height / 2 - superViewHeight / 2,
                                        superViewHeight / 2 - height / 2,
                                        superViewHeight,
                                        height);
        _sheetBackgroundView.frame = originFrame;
        _sheetBackgroundView.transform = CGAffineTransformMakeRotation(M_PI / 2);
    
        [self resizeButtons];
        [UIView animateWithDuration:0.2 animations:^{
            _dimmView.alpha = 1;
            _sheetBackgroundView.center = CGPointMake(height / 2, _sheetBackgroundView.center.y);
        }];
    }
    
    - (void)showInWindowFromLeft
    {
        [self showInViewFromLeft:[[[UIApplication sharedApplication] delegate] window]];
    }
    
    
    - (void)dismiss
    {
        [UIView animateWithDuration:0.2 animations:^{
            _dimmView.alpha = 0;
            if (CGAffineTransformEqualToTransform(_sheetBackgroundView.transform, CGAffineTransformMakeRotation(M_PI_2)))
            {
                CGFloat height = _sheetBackgroundView.frame.size.height;
                CGFloat superViewHeight = self.superview.frame.size.height;
                CGRect originFrame = CGRectMake(-height / 2 - superViewHeight / 2,
                                                superViewHeight / 2 - height / 2,
                                                superViewHeight,
                                                height);
                _sheetBackgroundView.frame = originFrame;
            }
            else
            {
                CGRect frame = _sheetBackgroundView.frame;
                frame.origin.y = self.superview.frame.size.height;
                _sheetBackgroundView.frame = frame;
            }
        } completion:^(BOOL finished) {
            [self removeFromSuperview];
        }];
    }
    
    #pragma mark - Private Methods
    
    + (UILabel *)buttonLabelWithText:(NSString *)text
    {
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 45)];
        label.text = text;
        label.font = [UIFont systemFontOfSize:19.0f];
        label.textColor = [UIColor whiteColor];
        label.shadowColor = [UIColor colorWithRed:44.0f/255.0f green:46.0f/255.0f blue:48.0f/255.0f alpha:1.0f];
        label.shadowOffset = CGSizeMake(0, -1.0f);
        label.backgroundColor = [UIColor clearColor];
        label.textAlignment = UITextAlignmentCenter;
        label.text = text;
        label.tag = BUTTON_LABEL_TAG;
        return label;
    }
    
    - (void)resizeButtons
    {
        CGFloat frameWidth = _sheetBackgroundView.frame.size.width;
        if (CGAffineTransformEqualToTransform(_sheetBackgroundView.transform, CGAffineTransformMakeRotation(M_PI_2)))
        {
            frameWidth =_sheetBackgroundView.frame.size.height;
        }
        for (UIView *eachButton in _buttonArray)
        {
            CGRect buttonFrame = eachButton.frame;
            buttonFrame.origin.x = 22;
            buttonFrame.size.width = frameWidth - 44;
            eachButton.frame = buttonFrame;
            
            UIView *label = [eachButton viewWithTag:BUTTON_LABEL_TAG];
            label.frame = CGRectMake(10, 0, eachButton.frame.size.width - 20, eachButton.frame.size.height);
        }
    }
    
    - (void)setActionSheetHeight:(CGFloat)height
    {
        _sheetBackgroundView.frame = CGRectMake(0, 0, 0, height);
    }
    
    - (void)addButton:(UIButton *)button
    {
        [_buttonArray addObject:button];
        [button addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside];
        [_sheetBackgroundView addSubview:button];
    }
    
    - (void)buttonTouched:(UIButton *)button
    {
        if (self.delegate && [self.delegate respondsToSelector:@selector(actionSheet:clickedButtonAtIndex:buttonTitle:)])
        {
            UILabel *label = (UILabel *)[button viewWithTag:BUTTON_LABEL_TAG];
            [self.delegate actionSheet:self clickedButtonAtIndex:button.tag buttonTitle:label.text];
        }
        [self dismiss];
    }
    
    @end
    2019-07-17 19:58:33
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载