是否可以创建多行 UISegmentedControl?
Is it possible to create multi line UISegmentedControl?
我的分段控件中有相对较长的文本项,因此我需要在某些点中断文本。是否可以使用换行符?我知道在按钮上我需要将换行符设置为自动换行,但是如何为 UISegmentedControl 设置它。
添加 [yourSegmentedControl layoutIfNeeded];
方法,然后将其添加为子视图。然后遍历所有的SegmentedControl子view,修改title标签的numberOfLines
属性
这是代码
for (id segmentItem in [yourSegmentedControl subviews])
{
if ([segmentItem isKindOfClass:[UILabel class]])
{
UILabel *titleLabel = (UILabel *) segmentItem;
titleLabel.frame = CGRectMake(0, 0, 100, 50); //modify the frame if the second line is not showing.
titleLabel.numberOfLines = 0;
}
}
如果你有一个标准UISegmentedControl
你可以使用下面的想法:
[_segmentedControl.subviews enumerateObjectsUsingBlock:^(UIView * obj, NSUInteger idx, BOOL *stop) {
[obj.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[UILabel class]]) {
UILabel *_tempLabel = (UILabel *)obj;
[_tempLabel setNumberOfLines:0];
}
}];
}];
您可能还需要设置实例的 height
。
注意: 我需要添加一点警告——正如 rmaddy 也正确指出的那样——这是一个非常脆弱的解决方案,因为如果分段控件的视图层次结构将在未来 iOS 版本中更改,代码可能不再正常工作。
请参考this answer
Swift 3+
UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
Objective C
[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];
我稍微修改了这个 link 的代码,这里是 Swift 扩展:
extension UISegmentedControl {
func makeTitleMultiline(){
for i in 0...self.numberOfSegments - 1 {
let label = UILabel(frame: CGRect(x: 0, y: -7, width: (self.frame.width-10)/CGFloat(self.numberOfSegments), height: self.frame.height))
label.textColor = i == 0 ? UIColor.red : UIColor.blue
label.text = self.titleForSegment(at: i)
label.numberOfLines = 0
label.textAlignment = .center
label.adjustsFontSizeToFitWidth = true
label.tag = i
self.setTitle("", forSegmentAt: i)
self.subviews[i].addSubview(label)
}
}
func setSelectedTitleColor() {
for i in 0...self.numberOfSegments - 1 {
let label = self.subviews[self.numberOfSegments - 1 - i].subviews[1] as? UILabel
label?.textColor = label?.tag == self.selectedSegmentIndex ? UIColor.red : UIColor.blue
}
}
}
Swift 4 个版本的解决方案。 segmentedControl 是您的 UISegmentedControl
.
实例
for segmentItem : UIView in segmentedControl.subviews
{
for item : Any in segmentItem.subviews {
if let i = item as? UILabel {
i.numberOfLines = 0
// change other parameters: color, font, height ...
}
}
}
不要忘记将 segmentedControl 的 高度设置为两倍的字体高度。
我的分段控件中有相对较长的文本项,因此我需要在某些点中断文本。是否可以使用换行符?我知道在按钮上我需要将换行符设置为自动换行,但是如何为 UISegmentedControl 设置它。
添加 [yourSegmentedControl layoutIfNeeded];
方法,然后将其添加为子视图。然后遍历所有的SegmentedControl子view,修改title标签的numberOfLines
属性
这是代码
for (id segmentItem in [yourSegmentedControl subviews])
{
if ([segmentItem isKindOfClass:[UILabel class]])
{
UILabel *titleLabel = (UILabel *) segmentItem;
titleLabel.frame = CGRectMake(0, 0, 100, 50); //modify the frame if the second line is not showing.
titleLabel.numberOfLines = 0;
}
}
如果你有一个标准UISegmentedControl
你可以使用下面的想法:
[_segmentedControl.subviews enumerateObjectsUsingBlock:^(UIView * obj, NSUInteger idx, BOOL *stop) {
[obj.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[UILabel class]]) {
UILabel *_tempLabel = (UILabel *)obj;
[_tempLabel setNumberOfLines:0];
}
}];
}];
您可能还需要设置实例的 height
。
注意: 我需要添加一点警告——正如 rmaddy 也正确指出的那样——这是一个非常脆弱的解决方案,因为如果分段控件的视图层次结构将在未来 iOS 版本中更改,代码可能不再正常工作。
请参考this answer
Swift 3+
UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
Objective C
[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];
我稍微修改了这个 link 的代码,这里是 Swift 扩展:
extension UISegmentedControl {
func makeTitleMultiline(){
for i in 0...self.numberOfSegments - 1 {
let label = UILabel(frame: CGRect(x: 0, y: -7, width: (self.frame.width-10)/CGFloat(self.numberOfSegments), height: self.frame.height))
label.textColor = i == 0 ? UIColor.red : UIColor.blue
label.text = self.titleForSegment(at: i)
label.numberOfLines = 0
label.textAlignment = .center
label.adjustsFontSizeToFitWidth = true
label.tag = i
self.setTitle("", forSegmentAt: i)
self.subviews[i].addSubview(label)
}
}
func setSelectedTitleColor() {
for i in 0...self.numberOfSegments - 1 {
let label = self.subviews[self.numberOfSegments - 1 - i].subviews[1] as? UILabel
label?.textColor = label?.tag == self.selectedSegmentIndex ? UIColor.red : UIColor.blue
}
}
}
Swift 4 个版本的解决方案。 segmentedControl 是您的 UISegmentedControl
.
for segmentItem : UIView in segmentedControl.subviews
{
for item : Any in segmentItem.subviews {
if let i = item as? UILabel {
i.numberOfLines = 0
// change other parameters: color, font, height ...
}
}
}
不要忘记将 segmentedControl 的 高度设置为两倍的字体高度。