美文网首页iOS技术点iOS编程精华收录
提醒对话框SPAlertController官方文档(iOS)

提醒对话框SPAlertController官方文档(iOS)

作者: S型身材的猪 | 来源:发表于2019-01-03 12:26 被阅读159次

    SPAlertControllergithub地址:https://github.com/SPStore/SPAlertController

    前言

    • 本框架采用VFL布局,3.0版本开始核心控件为UIStackView,风格与微信几乎零误差
    • 3.0版本开始对话框头部新增图片设置
    • 3.0版本开始action支持图片设置
    • 3.0版本开始,iOS11及其以上系统可单独设置指定action后的间距
    • 3.0版本开始支持富文本
    • action的排列可灵活设置垂直排列和水平排列
    • 每个action的高度自适应
    • 支持旋转(横竖屏)
    • 可以自定义各种UIView
    • 支持对话框毛玻璃和背景蒙层毛玻璃
    • 全面适配iPhoneX,iPhoneXR,iPhoneXS,iPhoneXS MAX

    CocoaPods

    platform:ios,'9.0'
    target 'MyApp' do
    pod 'SPAlertController', '~> 3.0.1'
    end

    弹出对话框举例

    SPAlertController *alert = [SPAlertController alertControllerWithTitle:@"我是主标题" message:@"我是副标题" preferredStyle:SPAlertControllerStyleActionSheet];
    
    SPAlertAction *action1 = [SPAlertAction actionWithTitle:@"Default" style:SPAlertActionStyleDefault handler:^(SPAlertAction * _Nonnull action) {}];
    SPAlertAction *action2 = [SPAlertAction actionWithTitle:@"Destructive" style:SPAlertActionStyleDestructive handler:^(SPAlertAction * _Nonnull action) {}];
    SPAlertAction *action3 = [SPAlertAction actionWithTitle:@"Cancel" style:SPAlertActionStyleCancel handler:^(SPAlertAction * _Nonnull action) {}];
    
    [alert addAction:action1];
    [alert addAction:action2];
    [alert addAction:action3]; 
    [self presentViewController: alert animated:YES completion:^{}];
    

    如果使用的是SPAlertControllerStyleActionSheet样式,将会默认从底部弹出,如果使用的是SPAlertControllerStyleAlert样式,则默认以缩放动画(由大到小)从中间弹出,并且SPAlertControllerStyleAlert下可以添加文本输入框

    Topics

    创建SPAlertController

    + (instancetype)alertControllerWithTitle:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(SPAlertControllerStyle)preferredStyle;
    
    + (instancetype)alertControllerWithTitle:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(SPAlertControllerStyle)preferredStyle animationType:(SPAlertAnimationType)animationType;
    

    上面2种创建方式唯一的区别就是:第2种方式多了一个animationType参数,该参数可以设置弹出动画。如果以第一种方式创建,会采用默认动画,默认动画跟preferredStyle 有关,如果是SPAlertControllerStyleActionSheet样式,默认动画为从底部弹出,如果是SPAlertControllerStyleAlert样式,默认动画为从中间弹出


    SPAlertController的头部配置

    • title,对话框的主标题
    • message,对话框的副标题
    • attributedTitle,对话框的主标题,富文本
    • attributedMessage,对话框的副标题,富文本
    • image,对话框的头部上的图标,位置处于主标题之上
    • titleColor,对话框主标题的颜色
    • titleFont,对话框主标题的字体
    • messageColor,对话框副标题的颜色
    • messageFont,对话框副标题的字体
    • textAlignment,对话框标题的对齐方式(标题指主标题和副标题)
    • imageLimitSize,对话框头部图标的限制大小,默认是无穷大


      CCCEDD6CF830366B48342E60646C6AA6.jpg

    SPAlertControllerd的action配置

    - (void)addAction:(SPAlertAction *)action;
    
    @property (nonatomic, readonly) NSArray<SPAlertAction *> *actions;
    

    添加action,actions里面存放的就是添加的所有action


    - (void)addTextFieldWithConfigurationHandler:(void (^ __nullable)(UITextField *textField))configurationHandler;
    
    @property(nullable, nonatomic, readonly) NSArray<UITextField *> *textFields;
    

    添加文本输入框,textFields存放的就是添加的所有textField


    09FCBF2A406195883C9EC5499374C189.jpg
    @property(nonatomic) UILayoutConstraintAxis actionAxis;
    

    该属性配置的是对话框action的排列方式,分垂直排列和水平排列; SPAlertControllerStyleActionSheet样式下:默认为UILayoutConstraintAxisVertical(垂直排列), 如果设置为UILayoutConstraintAxisHorizontal(水平排列),则除去取消样式action之外的其余action将水平排列;SPAlertControllerStyleAlert样式下:当actions的个数大于2,或者某个action的title显示不全时为UILayoutConstraintAxisVertical(垂直排列),否则默认为UILayoutConstraintAxisHorizontal(水平排列),此样式下设置该属性可以修改所有action的排列方式;不论哪种样式,只要外界设置了该属性,永远以外界设置的优先

    • SPAlertControllerStyleActionSheet样式下的垂直排列和水平排列


      7A600B9A637212BD3CB31E2D1C7F7FE7.jpg
    • SPAlertControllerStyleAlert样式下的垂直排列和水平排列


      60A345D6040C4B4D844C4B11E7A8A96F.jpg

    @property(nonatomic, assign) CGFloat minDistanceToEdges;
    

    该属性配置的是距离屏幕边缘的最小间距;SPAlertControllerStyleAlert样式下该属性是指对话框四边与屏幕边缘之间的距离,此样式下默认值随设备变化,SPAlertControllerStyleActionSheet样式下是指弹出边的对立边与屏幕之间的距离,比如如果从右边弹出,那么该属性指的就是对话框左边与屏幕之间的距离,此样式下默认值为70

    • 图中红色画线都是指minDistanceToEdges


      6560450974A8B35414A1B13429F9BCD5.jpg

    @property(nonatomic, assign) BOOL needDialogBlur;
    

    该属性是制造对话框的毛玻璃效果,3.0版本开始采用的是系统私有类_UIDimmingKnockoutBackdropView所实现


    @property(nonatomic, assign) CGPoint offsetForAlert;
    
    - (void)setOffsetForAlert:(CGPoint)offsetForAlert animated:(BOOL)animated;
    

    SPAlertControllerStyleAlert下的偏移量配置 ,CGPoint类型,y值为正向下偏移,为负向上偏移;x值为正向右偏移,为负向左偏移,该属性只对SPAlertControllerStyleAlert样式有效,键盘的frame改变会自动偏移,如果外界手动设置偏移只会取手动设置的


    - (void)setCustomSpacing:(CGFloat)spacing afterAction:(SPAlertAction *)action API_AVAILABLE(ios(11.0));
    
    - (CGFloat)customSpacingAfterAction:(SPAlertAction *)action API_AVAILABLE(ios(11.0));
    

    该API是设置和获取指定action后面的间距,如图中箭头所指,iOS11及其以上才支持


    3CB7E93FDA241F253BFE156D0B4AA7E2.jpg
    - (void)setBackgroundViewAppearanceStyle:(SPBackgroundViewAppearanceStyle)style alpha:(CGFloat)alpha;
    

    该API是设置背景蒙层的样式,分为半透明和毛玻璃效果,毛玻璃又细分为Dark,ExtraLight,Light3种样式


    6ABFFFFADAAAE68B0678A82839B864E8.jpg
    @property(nonatomic, assign) BOOL tapBackgroundViewDismiss;
    

    单击背景蒙层是否退出对话框,默认YES


    @property(nonatomic, assign) CGFloat cornerRadiusForAlert;
    

    SPAlertControllerStyleAlert下的圆角半径


    创建action

    + (instancetype)actionWithTitle:(nullable NSString *)title style:(SPAlertActionStyle)style handler:(void (^ __nullable)(SPAlertAction *action))handler;
    

    其中,title为action的标题,创建的时候仅支持普通文本,如果要使用富文本,可以另外设置action的属性attributedTitle,设置后会覆盖普通文本


    配置action

    • title,action的标题
    • attributedTitle,action的富文本标题,普通文本和富文本同时设置时,只会显示富文本
    • image,action上的图片,文字和图片都存在时,图片在左,文字在右
    • imageTitleSpacing,图片与文字之间的间距
    • titleColor,action标题的颜色
    • titleFont,action标题的字体
    • titleEdgeInsets,action标题的内边距,此属性能够改变action的高度
    • enabled,action是否能被点击

    自定义各大View

    • 自定义对话框的头部
    + (instancetype)alertControllerWithCustomHeaderView:(nullable UIView *)customHeaderView preferredStyle:(SPAlertControllerStyle)preferredStyle animationType:(SPAlertAnimationType)animationType;
    
    C874091BE0B4C7A16105726BA5029F9B.jpg
    • 自定义整个对话框
    + (instancetype)alertControllerWithCustomAlertView:(nullable UIView *)customAlertView preferredStyle:(SPAlertControllerStyle)preferredStyle animationType:(SPAlertAnimationType)animationType;
    
    10711A73856A0C4283EB5024A2C64587.jpg
    • 自定义对话框的action部分
    + (instancetype)alertControllerWithCustomActionSequenceView:(nullable UIView *)customActionSequenceView title:(nullable NSString *)title message:(nullable NSString *)message preferredStyle:(SPAlertControllerStyle)preferredStyle animationType:(SPAlertAnimationType)animationType;
    
    AB29E246B855E6A4F87C18631C2BFFDE.jpg

    关于自定义view的大小

    • 非自动布局,在传入自定义view之前,应该为自定义的view设置好frame,也可以在传入自定义view之后,调用API- (void)updateCustomViewSize:(CGSize)size设置其大小;
    • 自动布局,如果宽度和高度都能由子控件撑起来,那么你不需要设置frame,否则,宽度和高度只要有其中一个无法由子控件撑起,那么就必须设置其值,比如高度能被子控件撑起来,而宽度不能,那么你就必须手动设置一个宽度,高度可以不用设置或者设置为0都可。如果是xib或者storyboard,若自定义的view无法由子控件撑起来,SPAlertController会读取xib/storyboard中的默认frame,如果不合适,那么你应该修改xib/storyboard中的默认frame或者用纯代码重新设置frame。如果自定义view的宽度能够被子控件撑起,但同时又手动设置了自定义view的宽度,那么SPAlertController会取自动撑起的宽度和手动设置的宽度中较大的那个,高度同理。有一种情况要值得注意:如果子控件类似按钮这种不设置大小就自动会产生大小的子控件,同时该按钮设置了左右间距,那么它就能将自定义的view的宽度撑起,但是这种撑起来的宽度可能并非你想要的,因为按钮宽度是由内容自动产生,不是你设置的,这时你应该手动设置按钮的宽度,以便自定义的view的宽度被撑起的恰到好处,或者手动设置自定义view的宽度,这个手动设置的宽度,应该要比没有手动设置宽度的按钮将自定义view撑起来的宽度要大。
    • 当自定义的view的大小在对话框显示期间发生了变化,你应该调用- (void)updateCustomViewSize:(CGSize)size通知SPAlertController更新其大小

    相关文章

      网友评论

        本文标题:提醒对话框SPAlertController官方文档(iOS)

        本文链接:https://www.haomeiwen.com/subject/vilslqtx.html