2012-11-20 9 views
12

के सबव्यूव पर प्रोग्रामेटिक रूप से Autolayout मैंने एक कस्टम समूह बनाने के लिए UIView को उपclassed है दृश्य मैं अपने लेआउट में कुछ सरल चीजों को जोड़ने के लिए उपयोग करता हूं। इस समूह दृश्य में एक UILabel शामिल है जिसका उपयोग शीर्षक और UIView के रूप में किया जाता है जो पृष्ठभूमि रंग के साथ इसके कैलियर पर एक राउंडरेक्ट खींचता है। UITableView के अनुभागों को सोचें। मैं इस समूह को UIView छोड़कर और मेरी कक्षा को अपने सबक्लास में बदलकर स्टोरीबोर्ड पर जोड़ता हूं। सभी अच्छी तरह से काम करते हैं, मैंने एक्सकोड में उपयोगकर्ता परिभाषित रनटाइम विशेषताओं के माध्यम से शीर्षक सेट किया है। सभी महान काम करते हैं, मैं स्टोरीबोर्ड पर इस दृश्य में UILabels जोड़ता हूं और यह चलने पर शीर्षक लेबल बनाता है और सही बनाता है। मेरी groupView कीएक उपclassed UIView

संरचना:

  1. groupView: (UIView) clipToBounds: नहीं;
    • शीर्षक: (UILabel) समूह दृश्य के ऊपर स्थान पर रखा गया।
    • सामग्री दृश्य: (UIView) roundRect और कैलियर के माध्यम से रंग बनाता है, समूह दृश्य के समान आकार होना चाहिए।

तो समस्या क्या है? खैर, ऑटोलायआउट से निपटना एक दर्द है, लेकिन इस उपclassed UIView के लिए काम करने के लिए मुझे सामग्री सेट करने की आवश्यकता है प्रोग्राम देखें। मैं इस ऑटो लेआउट ASCII प्रारूप स्ट्रिंग के सिंटैक्स को नहीं समझ सकता। वर्तमान में मेरे पास है:

_contentView = [[UIView alloc]initWithFrame:self.bounds]; 

    _contentView.layer.cornerRadius = 5.0f; 
    _contentView.layer.masksToBounds=YES; 
    _contentView.backgroundColor=_backgroundColor; 
    _contentView.layer.borderWidth=_borderWidth; 
    _contentView.layer.borderColor=_borderColor.CGColor; 
    [self insertSubview:_contentView atIndex:0]; 
    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(self,_contentView); 
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[self]-0-[_contentView]-0-[self]" options:0 metrics:nil views:viewsDictionary]; 

    for (NSLayoutConstraint *constraint in constraints) { 
     [_contentView addConstraint:constraint]; 
    } 

कौन सा के साथ दुर्घटनाओं: न आया हुआ अपवाद 'NSGenericException', कारण की वजह से * समाप्त एप्लिकेशन: 'असमर्थ दृश्य पर बाधा स्थापित करने के लिए। क्या बाधा दृश्य के उप-भाग के बाहर से कुछ संदर्भित करती है? यह अवैध है। बाधा: दृश्य:> '

मैं यह पहली कोशिश की और यह अभी भी काम नहीं किया:

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_contentView); 
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[_contentView]-0-|" options:0 metrics:nil views:viewsDictionary]; 

कौन सा के साथ दुर्घटनाओं: * न आया हुआ अपवाद के कारण एप्लिकेशन समाप्त' NSGenericException ', कारण:' में असमर्थ देखने पर बाधा स्थापित करने के लिए। क्या बाधा दृश्य के उप-भाग के बाहर से कुछ संदर्भित करती है? यह अवैध है। बाधा: दृश्य:> '

शेख़ी: किसी भी तरह इस autolayout कैसे लाभ वजन भूमि के ऊपर अभी हमें काम को बचाने के लिए लगता है, लेकिन मैं नहीं दिख रहा। पृथ्वी पर क्यों वे संदर्भों और विधियों का उपयोग करने से आगे बढ़ते हैं या इस पुरातन प्रारूप स्ट्रिंग को भी टाइप करते हैं? यह करना कितना आसान होगा: [_contentView बाधा: NSLayoutFormatAlign देखने के लिए देख रहे हैं: स्वयं डिस्टेंस: 0.0f]; या कुछ समान है? मैं इस बिंदु पर स्प्रिंग्स और स्ट्रेट्स के साथ इतना सौदा करता हूं।

कोई भी मदद समझने, या सामग्री को बाधित करने के लिए मुझे सिंटैक्स दिखा रहा है स्वयं के आकार में देखें उपयोगी होगा।

+2

अपने रान के बारे में: Autolayout में एक सीखने की वक्र है और आप इसे पहले से नफरत करते हैं - लेकिन एक बार जब आप पूरी तरह से फ्रेम के बजाय बाधाओं में सोचते हैं, तो यह आसान हो जाता है। और "दृश्य प्रारूप" बहुत बेकार है, जब तक कि आप केवल एक पंक्ति में चीजें बिछा रहे हों। दूसरी विधि (बाधा WithItem ...) मूल रूप से सिंटैक्स है जो आप ऊपर अपने रेंट में हैं। – jrturton

+0

अगर किसी और को इस ASCII-Art प्रारूप स्ट्रिंग को समझने में समस्याएं आ रही हैं, तो मुझे यह ट्यूटोरियल उपयोगी पाया गया। मुझे पता है कि यह रूबी के लिए है लेकिन प्रारूप स्ट्रिंग उद्देश्य-सी में समान है। http://seanlilmateus.github.com – brucemartin

उत्तर

26

त्रुटि बताता है कि आप जानना चाहते हैं:

करता है देखने के सबट्री बाहर से बाधा संदर्भ कुछ?

हां यह करता है।यह इसके पर्यवेक्षण का संदर्भ देता है।

इन बाधाओं को आप पर्यवेक्षण में लागू करने की आवश्यकता है, इस मामले में groupView

+0

ठीक है, लेकिन क्या यह सबव्यूव की बाधा नहीं है? यह सबव्यूज है जिसे मुझे ऑटोरेसाइज करने की आवश्यकता है। क्या मैं बस इस गलत के बारे में सोच रहा हूँ? – brucemartin

+1

इस तरह के बारे में सोचें: 'groupView' के भीतर' contentView' के प्लेसमेंट और आकार पर इसकी बाधा है। बाधाओं को स्थापित करें अनुभाग देखें: http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/constraintFundamentals.html – jackslash

+0

ठीक है, हाँ, अब मैं इसे देखता हूं, यही कारण है कि एक्सकोड में बाधाएं नीचे दिखाई देती हैं superViews खुद को दृश्य नहीं है। अभी भी वाक्यविन्यास मुद्दे हैं। दस्तावेज़ों पर वापस, शायद यह इस समय डूब जाएगा। अंतर्दृष्टि के लिए धन्यवाद। – brucemartin

0

| चरित्र दृश्य प्रारूप भाषा में superview का प्रतिनिधित्व करता है, इसलिए मुझे लगता आप चाहते हैं:

@"|-0-[_contentView]-0-|" 

और फिर आप, जैसा कि आप एक दृश्य जो देख सकते हैं करने के लिए इसे जोड़ने की आवश्यकता contentView के बजाय आत्म करने के लिए बाधा जोड़ने की जरूरत शामिल सभी खिलाड़ियों। https://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html#//apple_ref/doc/uid/TP40010853-CH3-SW1

तुम भी उपयोग करके पूरी तरह से दृश्य प्रारूप से बच सकते हैं:

+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c 
+0

निश्चित रूप से यदि आप सामग्री के बजाय स्वयं को बाधा जोड़ते हैं, तो पाइप (|) स्वयं के पर्यवेक्षण का संदर्भ देगा? –

0

constrints जाँच की कोशिश, चाहे वे सही दृश्य करने के लिए जोड़ रहे हैं

यहाँ दृश्य भाषा के लिए संदर्भ है

जैसे:

UIView *yellowView = [[UIView alloc] init]; 
yellowView.backgroundColor = [UIColor yellowColor]; 
yellowView.translatesAutoresizingMaskIntoConstraints = false; 
[self.view addSubview:yellowView]; 

//ios 9 last 
NSLayoutConstraint *heightAnchor = [yellowView.heightAnchor constraintEqualToAnchor:self.purView.heightAnchor]; 
// addConstraints 
[self.view addConstraints:@[heightAnchor]]; 
[self.view setNeedsLayout]; 

यदि heightAnchor toyellowView को फ़ॉलो करना है तो जोड़ें। यह त्रुटि

[yellowView addConstraints: @ [heightAnchor]];