这样开始,我喜欢:
但后来我添加了一段,这种情况发生了:
宽度在IB中设置,而不是在代码中设置。
我需要的只是一种快速计算宽度的方法。最后,它会做这样的事情:
control.width = (labelWidths + marginWidths);
// where marginWidths = (marginWidth * control.numberOfSegments)
答案 0 :(得分:21)
您可以使用属性apportionsSegmentWidthsByContent
并将其设置为YES
。
答案 1 :(得分:8)
如下图所示,将自动尺寸属性更改为“与内容比例”。
答案 2 :(得分:7)
prgrmr的答案here中的方法适用于其预期目的,但不是这样。
不是在自定义UILabel子视图中添加不必要的开销,而是 我修改了上面链接中的示例代码以得出这个:
- (void)resizeSegmentsToFitTitles:(UISegmentedControl *)control {
CGFloat textWidth = 0; // total width of all text labels
CGFloat marginWidth = 0; // total width of all margins
NSUInteger nSegments = control.subviews.count;
UIView *aSegment = [control.subviews objectAtIndex:0];
UIFont *theFont = nil;
// get font for segment title label
for (UILabel *label in aSegment.subviews) {
if ([label isKindOfClass:[UILabel class]]) {
theFont = label.font;
break;
}
}
// calculate width of text in each segment
for (NSUInteger i = 0; i < nSegments; i++) {
NSString *title = [control titleForSegmentAtIndex:i];
CGFloat width = [title sizeWithFont:theFont].width;
CGFloat margin = 15;
if (width > 200) {
NSString *ellipsis = @"…";
CGFloat width2 = [ellipsis sizeWithFont:theFont].width;
while (width > 200-width2) {
title = [title substringToIndex:title.length-1];
width = [title sizeWithFont:theFont].width;
}
title = [title stringByAppendingString:ellipsis];
}
[control setTitle:title forSegmentAtIndex:i];
textWidth += width;
marginWidth += margin;
}
// resize segments to accomodate text size, evenly split total margin width
for (NSUInteger i = 0; i < nSegments; i++) {
// size for label width plus an equal share of the space
CGFloat textWidth = [[control titleForSegmentAtIndex:i]
sizeWithFont:theFont].width;
// the control leaves a 1 pixel gap between segments if width
// is not an integer value; roundf() fixes this
CGFloat segWidth = roundf(textWidth + (marginWidth / nSegments));
[control setWidth:segWidth forSegmentAtIndex:i];
}
// set control width
[control setFrame:CGRectMake(0, 0, (textWidth + marginWidth), 30)];
}
答案 3 :(得分:2)
第一个选项如下:
segmentedControl.setWidth(100, forSegmentAt: 0)
segmentedControl.setWidth(50, forSegmentAt: 1)
它可以为您提供单独调整大小的片段,同时坚持您定义的值,这意味着您可以根据需要调整美学。第二个选项如下:
segmentedControl.apportionsSegmentWidthsByContent = true
可以完全控制iOS,这可能是大多数时候最好的事情。
可从iOS 5.0获取
答案 4 :(得分:0)
它将调整分段控件的大小,以将文本容纳在每个分段的文本标签中。
override func viewDidLoad() {
super.viewDidLoad()
UILabel.appearance(whenContainedInInstancesOf: [UISegmentedControl.self]).numberOfLines = 0
}