2012-08-16 2 views
5

開始:
Screenshot1.png各セグメントのタイトルに基づいてセグメント化されたコントロールの幅を変更しますか?私が好きなこのよう

しかし、私は、セグメントを追加し、これが起こる:
Screenshot2.png幅がIBではなく、コードに設定されています。

私が必要とするのは、オンザフライで幅を計算する方法です。

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

答えて

7

その目的のために正常に動作しますが、これはそれではありませんhere 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)]; 
} 
+0

私がなぜ...最後のセグメントがtapableではありませんが、それはいけないタイトルを切り詰めるセグメント化されたコントローラの問題を修正するためにios7内の任意のideeaこれを使用していますか? – user1028028

+0

http://stackoverflow.com/questions/18890428/uisegmentedcontrol-truncates-segment-titles – user1028028

+0

[こちら](http://stackoverflow.com/a/23492688/2254935)は簡素化され、iOS 7のフレンドリーバージョンです。 –

18

あなたがプロパティapportionsSegmentWidthsByContentを使用し、それを設定することができますYES

+0

プログラムでテキストを変更すると、これは私にとってはうまくいかないようです。 – primehalo

+1

@primehaloプログラムでテキストを更新した後に毎回このプロパティを設定してみてください。 – Rajesh

+0

クイックフィックスのための@Rajesh! –

4

次の図に示すように、Auto-Sizeプロパティを 'Proportional to Content'に変更します。

enter image description here

+0

これは受け入れられる回答でなければなりません。これは最も簡単で簡単なもので、素晴らしいものです。ありがとう、Ankit。 –

関連する問題