iOS学习笔记(六):UISegmentedControl

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。


发表评论

电子邮件地址不会被公开。 必填项已用*标注