2012-08-16 16 views
5

शुरू होता है इस तरह है, जो मुझे पसंद है:
Screenshot1.pngप्रत्येक खंड में शीर्षक पर आधारित सेगमेंट नियंत्रण की चौड़ाई बदलें?

लेकिन तब मैं एक खंड जोड़ने के लिए और ऐसा होता है:
Screenshot2.png चौड़ाई आईबी में सेट है, कोड में नहीं।

मुझे बस फ्लाई पर चौड़ाई की गणना करने की विधि है। अंत में, यह कुछ इस तरह करना होगा:

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

उत्तर

7

prgrmr के जवाब में विधि here अपने इच्छित उद्देश्य के लिए ठीक काम करता है, लेकिन यह ऐसा नहीं है।

बजाय कस्टम UILabel subviews के साथ अनावश्यक भूमि के ऊपर जोड़ने,
मैं उदाहरण कोड ऊपर के लिंक में इस के साथ आने के लिए संशोधित किया है:

- (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 नहीं है चाहिए ... किसी भी ideea क्यों के साथ एक समस्या को दूर करने के iOS7 में यह उपयोग कर रहा हूँ? – user1028028

+0

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

+0

[यहां] (http://stackoverflow.com/a/23492688/2254935) सरलीकृत और आईओएस 7 अनुकूल संस्करण है। –

18

आप संपत्ति apportionsSegmentWidthsByContent का उपयोग करें और करने के लिए सेट कर सकते हैं YES

+0

जब मैं प्रोग्राम को प्रोग्रामेटिक रूप से बदलता हूं तो यह मेरे लिए काम नहीं करता है। – primehalo

+1

@primehalo पाठ को प्रोग्रामेटिक रूप से अपडेट करने के बाद हर बार इस संपत्ति को सेट करने का प्रयास करें। – Rajesh

+0

त्वरित फिक्स के लिए धन्यवाद @ राजेश !! –

4

जैसा कि नीचे चित्र में दिखाया गया है ऑटो-आकार की संपत्ति 'सामग्री के आनुपातिक' में बदलती है।

enter image description here

+0

यह स्वीकार्य उत्तर होना चाहिए - यह सबसे तेज़, आसान और महान काम करता है। धन्यवाद, अंकित। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^