美文网首页 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:指示器的样式怎么设置成圆角矩形?
  • 60bb751bf51b:请问是否有方法能访问YUSegment中的每个Segment对象?
    想在某个Segment上添加badge(以addSubview的方式)
    afishhhhh:@汤宇York 目前还没有诶
  • JopYin:我下载下来运行报一个错误:Command /bin/sh failed with exit code 126
    afishhhhh:@JopYin 这什么错误你也没说清楚
  • 60bb751bf51b:请问:是否可以用代码替换segment内容啊?
    60bb751bf51b:@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