Ios 是否可以创建多行UISegmentedControl?
我的分段控件中有相对较长的文本项,因此我需要在某些点打断文本。是否可以使用换行符?我知道在按钮处需要将换行设置为换行,但如何为UISegmentedControl设置换行。添加Ios 是否可以创建多行UISegmentedControl?,ios,uisegmentedcontrol,Ios,Uisegmentedcontrol,我的分段控件中有相对较长的文本项,因此我需要在某些点打断文本。是否可以使用换行符?我知道在按钮处需要将换行设置为换行,但如何为UISegmentedControl设置换行。添加[yourSegmentedControl LayoutFneed]
[yourSegmentedControl LayoutFneed]方法,然后将其添加为子视图。然后迭代所有分段控件子视图,并修改标题标签的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];
}
}];
}];
您可能还需要设置实例的高度
注意:我需要补充一点警告——正如rmaddy正确指出的那样——这是一个非常脆弱的解决方案,因为如果分段控件的视图层次结构在未来的iOS版本中发生更改,那么代码可能无法正常工作。请参阅
Swift 3+
UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
目标C
[[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setNumberOfLines:0];
我对此代码做了一点修改,下面是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 ...
}
}
}
不要忘记将分段控件的高度设置为字体高度的两倍。如果语句,则不需要使用第一个。根据定义,所有子视图都必须是UIView
实例。应该指出,这样的解决方案是脆弱的。虽然此代码进行了适当的检查以避免崩溃,但如果Apple更改分段控件的内部视图层次结构,它可能会在iOS更新期间轻易停止工作。是的,不幸的是,从您所指出的角度来看,这是非常脆弱的。我想我刚刚添加了第一个if
语句,因为例程。。。它不会痛,但是——正如你所说——它完全没有用。