![](/img/trans.png)
[英]How can I enable multiple segments of a UISegmentedControl to be selected?
[英]How can I calculate correct widths for UISegmentedControl segments?
我正在嘗試使用 UISegmentedControl 但無法計算段的寬度。 該控件使段的寬度都相同,這對於某些標題不起作用,例如:
http://morrisphotoart.com/tmp/Screenshot2011-07-13_21.17.33.png
如果我知道哪種字體並調用 setWidth:forSegmentAtIndex: 方法,我可以編寫代碼來計算段寬度,但我怎樣才能獲得字體? 還是有其他方法?
左邊和中間部分的標題不固定,所以我不能硬編碼寬度。
如果您可以支持 iOS 5 及更高版本,則可以使用屬性apportionsSegmentWidthsByContent
並將其設置為YES
。
來自 iOS 5 文檔:
按內容分配SegmentWidths
指示控件是否嘗試根據其內容寬度調整段寬度。
@property(nonatomic) BOOL 分配SegmentWidthsByContent
討論
如果此屬性的值為 YES,則對於寬度值為 0 的段,控件會嘗試根據其內容寬度調整段寬度。
編輯:更簡單的選擇可能是使用 iOS 5 屬性apportionsSegmentWidthsByContent
,如@Camsoft 的回答中所述
好吧,我最終通過子視圖(這可能會在未來的 iOS 中中斷)得到 UIFont。 作為一個模塊化/重用愛好者,我編寫了這個例程來完成它,然后分配空間,以便控件中的段均勻地分布在標題上。
-(void)resizeSegmentsToFitTitles:(UISegmentedControl*)segCtrl {
CGFloat totalWidths = 0; // total of all label text widths
NSUInteger nSegments = segCtrl.subviews.count;
UIView* aSegment = [segCtrl.subviews objectAtIndex:0];
UIFont* theFont = nil;
for (UILabel* aLabel in aSegment.subviews) {
if ([aLabel isKindOfClass:[UILabel class]]) {
theFont = aLabel.font;
break;
}
}
// calculate width that all the title text takes up
for (NSUInteger i=0; i < nSegments; i++) {
CGFloat textWidth = [[segCtrl titleForSegmentAtIndex:i] sizeWithFont:theFont].width;
totalWidths += textWidth;
}
// width not used up by text, its the space between labels
CGFloat spaceWidth = segCtrl.bounds.size.width - totalWidths;
// now resize the segments to accomodate text size plus
// give them each an equal part of the leftover space
for (NSUInteger i=0; i < nSegments; i++) {
// size for label width plus an equal share of the space
CGFloat textWidth = [[segCtrl titleForSegmentAtIndex:i] sizeWithFont:theFont].width;
// roundf?? the control leaves 1 pixel gap between segments if width
// is not an integer value, the roundf fixes this
CGFloat segWidth = roundf(textWidth + (spaceWidth / nSegments));
[segCtrl setWidth:segWidth forSegmentAtIndex:i];
}
}
NSArray *itemArray = [NSArray arrayWithObjects: @"Title1", @"Title2", @"Titl3", @"Title4",nil];
segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray];
segmentedControl.frame = CGRectMake(0, 0, 310, 35);
segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
segmentedControl.selectedSegmentIndex = 0;
[segmentedControl addTarget:self action:@selector(pickOne:) forControlEvents:UIControlEventValueChanged];
segmentedControl.tintColor=[UIColor grayColor];
for (id segment in [segmentedControl subviews])
{
for (id label in [segment subviews])
{
if ([label isKindOfClass:[UILabel class]])
{
[label setTextAlignment:UITextAlignmentCenter];
[label setFont:[UIFont boldSystemFontOfSize:12]];
}
}
}
iOS 7.1.1 友好。 我們只計算了 UISegmentedControl 新幀大小,rest(段比例)將由 iOS(基於 appportionsSegmentWidthsByContent)解決。
請注意,如果自動布局打開,這將不起作用。
void styleSegment_fitTitles(UISegmentedControl *segCtrl) {
// Fit segments' titles
[segCtrl sizeToFit];
CGFloat em = font.pointSize;
CGRect segCtrlRect = segCtrl.bounds;
CGFloat segCtrlWidth = segCtrlRect.size.width + segCtrl.numberOfSegments*em;
CGFloat segCtrlHeight = segCtrlRect.size.height + em;
CGFloat segmentY = segCtrl.frame.origin.y - (segCtrlHeight - segCtrlRect.size.height)/2;
segCtrl.frame = CGRectMake(segCtrl.frame.origin.x, segmentY, segCtrlWidth, segCtrlHeight);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.