根据每个片段中的标题更改分段控件的宽度?

像这样开始,我喜欢:
Screenshot1.png

但是,然后我添加一个段,发生这种情况:
Screenshot2.png 宽度在IB中设置,不在代码中。

我需要的只是一个计算宽度的方法。 最后,它会做这样的事情:

control.width = (labelWidths + marginWidths); // where marginWidths = (marginWidth * control.numberOfSegments) 

您可以使用属性apportionsSegmentWidthsByContent并将其设置为YES

prgrmr的答案在这里的方法工作正常的目的,但这不是。

而不是添加自定义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)]; } 

如下图所示,将Auto-Size属性更改为“与内容成比例”。

在这里输入图像说明