UISegmentedControl用于管理和实现一组内容的切换逻辑,如几个并列关系的界面之间相互切换。UISegmentedControl常见于导航栏的标题视图中,因其小巧的外表和简洁的接口风格,在iOS原生和第三方应用中都十分常见。
一、UISegmentedControl基本属性的使用
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//定义UISegmentedControl
let seg = UISegmentedControl(items: ["one","two","three",""])
//设置大小、位置
seg.frame = CGRect(x: 20, y: 100, width: 280, height: 30)
//设置按钮图案
seg.setImage(UIImage(named: "image")?.withRenderingMode(.alwaysOriginal), forSegmentAt: 3)
//设置按钮内容位置偏移
seg.setContentOffset(CGSize(width: 5, height: 0), forSegmentAt: 3)
//设置按钮模式
seg.isMomentary = true
//添加到主视图
self.view.addSubview(seg)
}
}
运行结果如下所示:
代码中使用带item数组构造方法来初始化UISegmentedControl对象,这个方法中需要传入一个标题数组,数组中字符串的个数和内容决定了UISegmentedControl控件中按钮的个数和标题。setImage方法用于设置某个按钮的图案,其中按钮的编号index从0开始计算。而imageWithRenderingMode代表UIImage渲染模式,它使用UIImageRenderingMode枚举值来设置图片的renderingMode属性。该枚举中包含的值如下所示:
public enum UIImageRenderingMode : Int {
case automatic // 根据图片的使用环境和所处的绘图上下文自动调整渲染模式
case alwaysOriginal // 始终绘制图片原始状态,不使用Tint Color
case alwaysTemplate // 始终根据Tint Color绘制图片,忽略图片的颜色信息
}
setContentOffset方法设置其中某个按钮内容的位置偏移。UISegmentedControl的isMomentary属性默认为Bool值假,控件为切换按钮模式(当用户点击按钮后,按钮一直会保持选中状态直到用户切换另一个按钮);若设置为Bool值真,控件就为触发按钮模式(用户手指离开屏幕后按钮不保持选中状态)。
二、对UISegmentedControl中的按钮进行增、删、改操作
UISegmentedControl对象中的按钮除了在初始化时可以进行创建外,在程序运行的过程中,也可以进行动态添加、删除、修改操作。UISegmentedControl中有如下方法可供开发者使用:
//插入
seg.insertSegment(withTitle: "new", at: 2, animated: true)
//移除
seg.removeSegment(at: 1, animated: true)
//重新设置某项按钮标题
seg.setTitle("replace", forSegmentAt: 1)
//移除所有的按钮
seg.removeAllSegments()
三、UISegmentedControl中按钮宽度自适应
UISegmentedControl控件中按钮宽度默认是平均分配的,如果某个按钮的标题长度超出了宽度的范围,将会被自动截断,如下图:
开发者可以手动对UISegmentedControl中每个按钮的宽度进行设置,以便设置按钮宽度与其文字相适应,示例代码如下:
seg.setWidth(100, forSegmentAt: 0)
运行结果如下图:
上面的方法可以对UISegmentedControl中按钮宽度进行设置,但是有一个致命的缺点,开发者可能不知道这个按钮上面标题文字所占的宽度,如果使用强制计算的方法,就会徒增许多代码量。幸运的是,UISegmentedControl中还提供了一个属性,可以让UISegmentedControl自己计算其中按钮需要的宽度,让其进行宽度自适应,代码如下:
seg.apportionsSegmentWidthsByContent = true
将apportionsSegmentWidthsByContent属性的Bool值设为真,UISegmentedControl控件中的按钮宽度将会进行自适应。
值得一提的是,UISegmentedControl添加触发方法也是通过addTarget方法来设置的,需要监听的触发动作与UISwitch控件一致,为valueChanged。