iOS 类似于微信的 ActionSheet

1,518 阅读2分钟
原文链接: ppsheep.com

之前在做图片浏览器的时候 需要用到类似于微信的ActionSheet 本来可以直接使用iOS官方的UIAlertController 但是我觉得上了 iOS9 之后 这个ActionSheet好丑 不喜欢 就自己 写了一个简单的

先看一下效果图

ActionSheet

实现起来 还是挺简单的

首先肯定是一个自定义的view,在这里 是使用delegate实现点击捕获的 个人感觉delegate使用起来比较简单 当然block使用起来也不是特别麻烦,这个就看个人爱好吧

在自定义view里面有一个协议

@protocol PPSActionSheetDelegate 
@required //当然这个可以写成optional的,但是不捕获点击事件,又做actionsheet干啥呢  就干脆写成了必须实现的  这样在使用的时候 发现未实现方法
/**
 点击选项 实现这个代理必须实现这个方法 不然点击不能实现
 @param actionSheet 当前显示的actionsheet 如果存在多个actionsheet 可以分别出是哪一个actionsheet
 @param buttonIndex 点击的位置
 */
- (void)actionSheet:(PPSActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex;
@end
在点击事件里面 回传actionsheet的目的 是因为在一个viewcontroller里面可能会有多个 actionsheet展现,在同一个VC里面就需要区分 是哪个actionsheet 来区分操作

不同的actionsheet当然可以使用tag来区分 当然也可以用其他的方法区分

这里就仁者见仁智者见智了

实现方法里面也没有什么可讲的 都是很简单的实现方法

根据传入的标题数目 来创建button选项

这一段代码 其实是对传入的othertitles的一个遍历 创建选项

va_list是C语言中 解决变参问题的一组宏

NSString* curStr;
va_list list;
   if(otherTitles)
   {
       [self setupBtnWithTitle:otherTitles];
       
       va_start(list, otherTitles);
       while ((curStr = va_arg(list, NSString*))) {
           [self setupBtnWithTitle:curStr];
           
       } 
       va_end(list);
   }

根据颜生成图片的方法:

/**
 根据颜色生成图片
 @param color 颜色
 @return 图片
 */
- (UIImage*)imageWithColor:(UIColor*)color
{
    CGRect rect=CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return theImage;
}

源码放在了:
github.com/yangqian111…