美文网首页 ios零碎记录UIKitios
开源一个 SegmentedControl

开源一个 SegmentedControl

作者: afishhhhh | 来源:发表于2016-12-19 13:35 被阅读1935次

    这是我近期完成的一个项目,目前还在寻找那些没有被我发现的 BUG。

    地址:YUSegment

    YUSegment 是一个可以自定义设置 UI 的 Segmented Control,尽可能保留了原生 UISegmentedControl 的接口。

    demo.png

    Features

    • 支持 (Attributed)text 和 image
    • 有两种(线形和圆角矩形的指示器)不同的样式可以选择
    • 支持横向滚动
    • 可以自定义 font,color,border 等等
    • 需要 iOS 8.0+,支持 ARC

    Installation

    Cocoapods

    1. 在 Podfile 中添加 pod 'YUSegment'
    2. 执行 pod install 命令
    3. 导入头文件 #import "YUSegment.h"

    Usage

    可以通过 Storyboard 和 纯代码的方式创建一个 YUSegment。

    Code(推荐)

    NSArray *titles = @[@"Left", @"Medium", @"Right"];
    YUSegment *segment = [[YUSegment alloc] initWithTitles:titles];
    [self.view addSubview:segment];
    segment.frame = (CGRect){20, 60, [UIScreen mainScreen].bounds.size.width - 40, 44};
    

    Storyboard

    1. 从 Object Library 拖拽一个 "UIView" 到 storyboard.
    2. 修改 view 的位置和大小


      storyboard2.png
    3. 在 Identify Inspector 中将 class 修改为 YUSegment,然后建立一个 outlet。


      storyboard1.png
    @property (weak, nonatomic) IBOutlet YUSegment *segment;
    
    1. 你可以在 Attributes Inspector 修改其他的属性。


      storyboard3.png

    更多的例子可以参考 YUSegmentDemo

    APIs

    Target-Action

    和 UISegmentedControl 类似,你只需要使用以下的代码:

    [segment addTarget:self action:@selector(someMethod) forControlEvents:UIControlEventValueChanged];
    

    Images

    在默认的情况下,如果 segment 的内容有图片,无论当前的 segment 有没有被选中,都是展示相同的图片。可以调用 -replaceDeselectedImages: 或者 -replaceDeselectedImageWithImage:atIndex: 替换掉未选中状态下的图片。

    Attributed Text

    YUSegment 没有实例方法能够直接将一个 attributed string 作为参数,你需要通过 -setTitleTextAttributes:forState: 方法来设置 attributed string。

    NSDictionary *attributes = @{NSFontAttributeName : [UIFont systemFontOfSize:20]};
    [segment setTitleTextAttributes:attributes forState:YUSegmentedControlStateNormal];
    

    Layer

    你可以在 Attributes Inspector 设置 borderColorborderWidthcornerRadius 等属性,如果通过代码的方式来设置这些属性,可以像下面这样:

    segment.layer.borderWidth = someValue;
    segment.layer.borderColor = someValue;
    

    需要注意的是:你需要通过 cornerRadius 而不是 layer.cornerRadius 来设置圆角,因为前者会自动为指示器设置上圆角。

    Scrolling Enabled

    YUSegment 没有类似 scrollEnabled 的属性,如果你要使 segmented control 能够横向滚动,你需要设置 segmentWidth 的值,该属性能够自动使 segmented control 支持横向滚动。

    New Features:

    Version 0.1.4:
    • 个人比较偏爱链式语法,所以尝试加了这个特性,可以使用以下方法修改 borderColorborderWidth
    segment.borderWidth(1.0).borderColor([UIColor redColor]);
    
    Version 0.2.0:
    • 暴露只读属性 indicator,可以为该属性设置背景颜色以及边框样式等。
    segment.indicator.backgroundColor = [UIColor redColor];
    segment.indicator.layer.borderWidth = 1.0;
    segment.indiactor.layer.borderColor = [UIColor redColor].CGColor;
    
    • 为 segment 设置边框同样支持链式语法:
    segment.indicator.borderWidth(1.0).borderColor([UIColor redColor]);
    

    如果大家觉得 YUSegment 还可以,就给一个 star 吧😀😀😀。

    相关文章

      网友评论

      • dde4f931ea3e:指示器的样式怎么设置成圆角矩形?
      • 汤宇York:请问是否有方法能访问YUSegment中的每个Segment对象?
        想在某个Segment上添加badge(以addSubview的方式)
        afishhhhh:@汤宇York 目前还没有诶
      • JopYin:我下载下来运行报一个错误:Command /bin/sh failed with exit code 126
        afishhhhh:@JopYin 这什么错误你也没说清楚
      • 汤宇York:请问:是否可以用代码替换segment内容啊?
        汤宇York:@afishhhhh
        如何做?
        我研究了1天没找到方法,只能用回UISegmentedControl
        ios_copy:喜欢 赞
        afishhhhh:@汤宇York 可以
      • Madlife_ZYC:大神666求问大神那个橙色的线的颜色怎么改 :flushed: 请原谅我是个小白
        Madlife_ZYC:@afishhhhh 搞定搞定,多谢大神 :bow:
        afishhhhh:@Madlife_ZYC segment.indicator.backgroundColor = color,这个你试下
      • SoolyChristina:挺好的。
        afishhhhh:@SoolyChristina 谢谢
      • 简书弧线:很不错, 看起来简洁美观! :heart:
        afishhhhh:@简书弧线 谢谢

      本文标题:开源一个 SegmentedControl

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