के माध्यम से NSLayoutConstraint को जोड़ना और सेट करना मुझे NSLayoutConstraint
के साथ कुछ परेशानी है।कोड
NSLayoutConstraint मुझे setConstant:
विधि का उपयोग करने का प्रयास करने का प्रयास करता है। जब मैं कोड के माध्यम से ऊंचाई बाधा जोड़ता हूं तो मुझे केवल यह समस्या होती है।
सबसे पहले, मैं तो जैसे ऊंचाई बाधा हो रही है:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeWidth];
NSArray *filteredArray = [[self constraints] filteredArrayUsingPredicate:predicate];
return filteredArray[0];
कौन सा मुझे सही बाधा देता है। मेरे पास एक NSTextField उपclass है जहां यह पूरी तरह से काम करता है। बाधाएं इंटरफ़ेस बिल्डर में सेट की गई हैं, और मैं निरंतर सेट और बदल सकता हूं।
अब मेरे पास एक दृश्य है, जहां मैं रन-टाइम पर विभिन्न सबव्यूव जोड़ता हूं। वे सबव्यूव अपने एनआईबी में स्थित हैं, जिसका अर्थ है कि मैं उनकी चौड़ाई और ऊंचाई को पिन नहीं कर सकता। तो मैंने सोचा कि जैसे ही दृश्य पर्यवेक्षण में जोड़ा जा रहा है, मैं बाधाओं को जोड़ दूंगा। इसे viewDidMoveToSuperview
में निष्पादित किया जा रहा है।
// Pin Width & Height
[self addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:self.frame.size.width]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:self.frame.size.height]];
बाधाओं को जोड़ा जाता है, मैं इसे एनएसएलओजी के साथ पुष्टि कर सकता हूं।
"<NSLayoutConstraint:0x100605cc0 H:[ITControlPanelChildView:0x100616eb0(269)]>",
"<NSLayoutConstraint:0x100614410 V:[ITControlPanelChildView:0x100616eb0(317)]>"
अब, अंत में, जब मैं [constraint setConstant:somethingDifferent];
का उपयोग कर बाधा बदलने की कोशिश मैं निम्नलिखित अपवाद:
Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0x10192fcb0 V:[ITControlPanelChildView:0x10192e4f0(100)]>",
"<NSAutoresizingMaskLayoutConstraint:0x10053ff10 h=--& v=&-- V:[ITControlPanelChildView:0x10192e4f0(317)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x10192fcb0 V:[ITControlPanelChildView:0x10192e4f0(100)]>
यह ठीक बाधा मैं बदलने के लिए कोशिश कर रहा हूँ है। क्या कोई मुझे बता सकता है कि यह क्यों हो रहा है?
संपादित
मैं सिर्फ पढ़ा है कि NSAutoresizingMaskLayoutConstraint
s अपने आप जुड़ जाते हैं, यदि आप [self setTranslatesAutoresizingMaskIntoConstraints:NO];
सेट आप को अक्षम कर सकते हैं।
यदि मैं इसे अक्षम करता हूं, तो यह काम करता है।
इससे भी बेहतर होगा कि अगर मैं NSAutoresizingMaskLayoutConstraint
बनाया गया हो तो बेहतर होगा। क्या कोई जानता है कि यह कैसे काम करता है?
सोचें कि आपने कहा कि जब मैं अपना जवाब लिख रहा था तब संपादित करें! सबव्यूव के लिए xib में Autolayout चालू है? क्या आप सबव्यू जोड़ने के लिए उपयोग कर रहे कोड को दिखा सकते हैं? – jrturton
@jrturton हां, autolayout चालू है। शायद तुमने मुझे गलत पाया, यह काम कर रहा है। मैंने सोचा कि यह अच्छा होगा अगर मैं 'NSAutoresizingMaskLayoutConstraint' का उपयोग कर सकता हूं, जो पहले से ही मेरे लिए बनाया गया है, उन्हें अक्षम करने और बाधाओं को जोड़ने के बजाय। क्या आपको मेरा मतलब है? – NSAddict
मैं करता हूं, लेकिन आप नहीं कर सकते। मुझे आश्चर्य है कि वे ऑटोलायआउट xib में शीर्ष स्तर पर परिभाषित एक दृश्य पर आते हैं, हालांकि, मैंने कोड के बारे में पूछा। – jrturton