【问题标题】:UISegmentedControl text with multiple linesUISegmentedControl 多行文本
【发布时间】:2016-12-17 01:35:15
【问题描述】:
是否有可能在 iOs 9+ 中使用多行文本制作 UISegmentedControl?
到目前为止我已经尝试过:
- SO 主题的变体:
This, this and this one
-
做一个扩展:
extension UISegmentedControl
{
func makeMultiline(numberOfLines: Int)
{
for segment in self.subviews
{
let labels = segment.subviews.filter { $0 is UILabel } // [AnyObject]
labels.map { ($0 as UILabel).numberOfLines = numberOfLines }
}
}
}
-
从 UISegmentedControl 继承并在 Identity Inspector 中将新类设置为 SegmentedControl
class MultilineSegmentedControl: UISegmentedControl
{
override func didMoveToSuperview()
{
for segment in subviews
{
for subview in segment.subviews
{
if let segmentLabel = subview as? UILabel
{
segmentLabel.numberOfLines = 2
}
}
}
}
}
-
用文本代替标题设置图像并在
中更改UISegmentedControl的框架
viewDidLayoutSubviews()
方法。它使 UISegmentedControl 高度变大,但图像保持它的高度,就好像 UISegmentedControl 没有放大并且在第一次交互时 UISegmentedControl 缩小到它的默认高度。
【问题讨论】:
标签:
ios
swift
uisegmentedcontrol
【解决方案1】:
也许有点晚了,但这是我在 swift 3 中解决这个问题的子类:
@IBDesignable class MySegmentedControl: UISegmentedControl {
@IBInspectable var height: CGFloat = 29 {
didSet {
let centerSave = center
frame = CGRect(x: frame.minX, y: frame.minY, width: frame.width, height: height)
center = centerSave
}
}
@IBInspectable var multilinesMode: Bool = false
override func layoutSubviews() {
super.layoutSubviews()
for segment in self.subviews {
for subview in segment.subviews {
if let segmentLabel = subview as? UILabel {
segmentLabel.frame = CGRect(x: 0, y: 0, width: segmentLabel.frame.size.width, height: segmentLabel.frame.size.height * 1.6)
if (multilinesMode == true)
{
segmentLabel.numberOfLines = 0
}
else
{
segmentLabel.numberOfLines = 1
}
}
}
}
}
}
【解决方案2】:
试试下面的代码,找出所有的segmentedControl子UILabel并设置numberOfLines。
for segmentViews in segmentedControl.subviews {
for segmentLabel in segmentViews.subviews {
if segmentLabel is UILabel {
(segmentLabel as! UILabel).numberOfLines = 0
}
}
}