2013-02-20 64 views
21

मेरे पास ऑटोलायआउट सक्षम के साथ एक आईओएस व्यू है और UISearchBar और UISegmentControl टूलबार के साथ निहित है। मैं UISearchBar चाहता हूं ताकि लचीला चौड़ाई हो ताकि मुझे इसे मजबूर करने के लिए बाधा डालना पड़े, लेकिन मैं जो कह सकता हूं उससे आप इंटरफेस बिल्डर में UIToolbar में आइटमों में बाधाएं नहीं जोड़ सकते हैं। विकल्प सभी अक्षम हैं।आईओएस Autolayout और UIToolbar/UIBarButtonItems

AutoLayout से पहले मैं autoresizingmasks के साथ इसे पूरा करूँगा।

UIToolbars/UINavigationBars के भीतर बाधाओं की अनुमति नहीं है?

ऑटोलायआउट का उपयोग करते समय यह और कैसे किया जा सकता है?

+0

मैंने पहले इस तरह की कुछ सामान किया है की तलाश में stumbbled, हालांकि मैं मूल रूप से देखने के आकार के आकार की प्रतीक्षा करता हूं और फिर तदनुसार लक्ष्य दृश्य के फ्रेम को अद्यतन करता हूं। यह हमेशा एक विकल्प है अगर यह पता चला कि स्वचालित रूप से ऐसा करने का कोई तरीका नहीं है। – Brian

+0

क्या आप एक छवि पोस्ट कर सकते हैं? –

+0

मैं चाहता था, लेकिन मैं ऑटोलाउट छोड़ने और ऑटोरेसाइजिंगस्क का उपयोग करने के लिए वापस जा रहा था। यह उस मॉडल का उपयोग करके बहुत अच्छा काम करता है। – outerstorm

उत्तर

23

ऑटोलायआउट बाधाएं केवल UIViews और उनके उप-वर्गों के साथ काम करती हैं।

जबकि UIToolbar कुछ UIView आधारित आइटम (UISearchBar और UISegmentedControl जैसे) वे UIBarButtonItems जो UIView से विरासत नहीं है के साथ एक साथ होना पड़ सकता है की अनुमति देता है।

ऑटोलायआउट UIBarButtonItems के साथ काम कर सकता है, जैसा आपने किया है।

आपका विकल्प केवल UIViews पर आधारित विगेट्स के साथ अपना टूलबार रोल करना है।

+4

कोई विचार अगर ऐप्पल इसे हल करने में काम कर रहा है? यह मुझे खराब करता है कि अगर मुझे अलग-अलग स्थानों में AL और पुराने दृष्टिकोण का उपयोग करना है तो असंगतता टूट जाती है ... – Petar

7

आप इसे कम से कम कोड में कर सकते हैं; मैं इंटरफ़ेस बिल्डर को त्यागने के लिए और कोड में इसे किसी भी तरह से जाने का प्रकार हूं। आईबी लगता है कि जब बाधाओं को जोड़ने या ट्विक करने की बात आती है तो उससे अधिक बार मेरे रास्ते में नहीं मिलता है। यहां मैंने अपने कस्टम UIToolbar सबक्लास के -initWithFrame: विधि में किया है।

- (instancetype)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     [self addSubview:self.label]; 

     [self addConstraint:[NSLayoutConstraint 
          constraintWithItem:self.label 
          attribute:NSLayoutAttributeCenterX 
          relatedBy:NSLayoutRelationEqual 
          toItem:self 
          attribute:NSLayoutAttributeCenterX 
          multiplier:1 constant:0]]; 
     [self addConstraint:[NSLayoutConstraint 
          constraintWithItem:self.label 
          attribute:NSLayoutAttributeCenterY 
          relatedBy:NSLayoutRelationEqual 
          toItem:self 
          attribute:NSLayoutAttributeCenterY 
          multiplier:1 constant:0]]; 
    } 
    return self; 
} 

और क्योंकि मैं के रूप में ज्यादा संभव के रूप में आलसी लोड करने के लिए हैं, तो यहां मेरी self.label उदाहरण चर (जब [self addSubview:self.label] ऊपर संदेश भेजा जाता है कहा जाता है) है।

- (UILabel *)label { 
    if (_label) return _label; 
    _label = [UILabel new]; 
    _label.translatesAutoresizingMaskIntoConstraints = NO; 
    _label.textAlignment = NSTextAlignmentCenter; 
    return _label; 
} 

मेरे लिए काम करने लगता है। मैं कोई भी UIBarButtonItems नहीं जोड़ रहा हूं, इसलिए, आपका माइलेज मेरा अलग-अलग है।

+0

यदि आप बाधाओं का उपयोग करके मौजूदा टूलबार को पुनर्स्थापित करने का प्रयास कर रहे हैं, तो आपको NSLayoutAttributeCenterX बाधा बहुत उपयोगी होगी। – russes

8

यह स्टोरीबोर्ड से भी किया जा सकता है।

बस टूलबार में आइटम खींचें और छोड़ें, और वांछित प्रभाव प्राप्त करने के लिए उनमें से कुछ को लचीला या निश्चित स्थान में बदलें। नीचे दो उदाहरण देखें।

Evenly spaced

Centered

एनबी: इस Aligning UIToolBar items करने के लिए अपने जवाब की एक प्रति है, मैं दोनों सवालों पर जबकि इस तरह के एक समाधान