2012-12-19 14 views
9

के माध्यम से 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 बनाया गया हो तो बेहतर होगा। क्या कोई जानता है कि यह कैसे काम करता है?

+0

सोचें कि आपने कहा कि जब मैं अपना जवाब लिख रहा था तब संपादित करें! सबव्यूव के लिए xib में Autolayout चालू है? क्या आप सबव्यू जोड़ने के लिए उपयोग कर रहे कोड को दिखा सकते हैं? – jrturton

+0

@jrturton हां, autolayout चालू है। शायद तुमने मुझे गलत पाया, यह काम कर रहा है। मैंने सोचा कि यह अच्छा होगा अगर मैं 'NSAutoresizingMaskLayoutConstraint' का उपयोग कर सकता हूं, जो पहले से ही मेरे लिए बनाया गया है, उन्हें अक्षम करने और बाधाओं को जोड़ने के बजाय। क्या आपको मेरा मतलब है? – NSAddict

+0

मैं करता हूं, लेकिन आप नहीं कर सकते। मुझे आश्चर्य है कि वे ऑटोलायआउट xib में शीर्ष स्तर पर परिभाषित एक दृश्य पर आते हैं, हालांकि, मैंने कोड के बारे में पूछा। – jrturton

उत्तर

8

जैसा कि आपने लॉग इन किए गए लॉग संदेश में इंगित किया है, आपको ऑटोरेसाइजिंग बाधाएं मिली हैं जिन्हें आप नहीं चाहते हैं या आवश्यकता नहीं है।

जब आप सबव्यूव जोड़ते हैं तो आप इन्हें हटा सकते हैं। विधि आप ऊपर का उपयोग कर रहे है, सिर्फ इस पंक्ति जोड़ें:

self.translatesAutoresizingMaskIntoConstraints = NO; 

हालांकि अगर आप एक अलग निब में दृश्य पैदा कर रहे है, जहां यह से उसके आकार हो रही है? क्या इसमें पहले से ही आकार की बाधाएं नहीं हैं जिन्हें आप केवल आउटलेट बना सकते हैं?

1

मुझे यह समस्या दो बार मिली है।

मैंने हिलेगैस & द्वारा मैक ओएसएक्स 4 वें एड के लिए कोको प्रोग्रामिंग में वर्णित एक तकनीक का उपयोग किया। पुस्तक एनएसबीओक्स को व्यू कंटेनर के रूप में उपयोग करने और कोड का उपयोग करके दृश्यों को स्विच करने की सलाह देती है।पुस्तक में आपके द्वारा अभी स्विच किए गए दृश्य को पकड़ने के लिए बाहरी युक्त विंडो को मैन्युअल रूप से आकार देने के लिए कुछ आसान कोड भी शामिल है।

पहली बार मैं अपनी तकनीक की कोशिश की मैं इस अपवाद है: Frustratingly पर्याप्त

2013-01-05 22:56:05.103 MyApp[17717:303] Unable to simultaneously satisfy constraints: 
(
    "<NSAutoresizingMaskLayoutConstraint:0x100141330 h=--& v=--& H:[NSView:0x10012fdf0(4)]>", 
"<NSLayoutConstraint:0x1001316c0 H:[NSScrollView:0x100123ff0]-(NSSpace(20))-| (Names: '|':NSView:0x10012fdf0)>", 
"<NSLayoutConstraint:0x1001315d0 H:|-(NSSpace(20))-[NSScrollView:0x100123ff0] (Names: '|':NSView:0x10012fdf0)>") 

Will attempt to recover by breaking constraint 

मैं यूआई refactor करने के लिए था और पुनर्निर्माण संस्करण में (जो एक साधारण बजाय NSDocument पर आधारित है खिड़की) मैंने एक ही समस्या को फिर से मारा।

यदि मैं उप-विचारों पर अनुवाद करने के लिए AutoResizingConstraints को सेट करता हूं तो उन्हें ठीक से नहीं रखा जाता है। लेकिन वे उप-विचार जटिल हैं इसलिए यह समाधान नहीं है क्योंकि मेरी खिड़कियां नहीं रखी गई हैं। हालांकि अपवाद को फेंकने से रोकता है।

यदि मैं शीर्ष स्तर एनएसडी दस्तावेज़ आधारित विंडो XIB पर ऑटोलाउट बंद करता हूं - तो अपवाद भी फेंक दिया जाता है। लेकिन फिर शीर्ष स्तर के तत्वों के लिए लेआउट गलत है, और बॉक्स सही ढंग से आकार नहीं है। यह इतना जटिल नहीं है कि मैं इसे अनुमान लगाकर मैन्युअल रूप से नहीं रख सका।

अजीब चीज यूआई के पहले संस्करण पर है जो इसे फेंकने के साथ काम करती है। पहले संस्करण में ऑटोलायआउट शीर्ष-स्तरीय दृश्य और सभी सबव्यू के लिए सेट है।

मैं अपने जीवन के लिए नहीं देख सकता कि एक में अस्पष्ट सेटिंग चालू है, लेकिन दूसरी नहीं। मैंने सटीक उसी कोड को चिपकाया जो दस्तावेज़ संस्करण में दृश्यों को स्वैप करने के लिए विंडो संस्करण में काम करता है, और मैं प्रत्येक सेटिंग की जांच करके नियंत्रण के माध्यम से नियंत्रण के माध्यम से चला गया।

पहली बार इस मुद्दे को ठीक करने की मेरी याददाश्त यह है कि मैंने एक्सआईबी पर ऑटोलाउट बंद कर दिया था, लेकिन अब इसे दूसरी बार ठीक करने की कोशिश कर रहा है, ऑटोलाउट चालू है और यह ठीक काम करता है।

पहला संस्करण काम करता है - दूसरा नहीं। एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि किसी भी तरह एनएसडी दस्तावेज़ में कुछ और कुछ और समस्या पैदा कर रहा है।

हालांकि मुझे नंबर दो के मामले में इसे ठीक करने का कोई तरीका मिला: एनएसबॉक्स का दृश्य कंटेनर के रूप में उपयोग किए जाने वाले "ऑटो रीसाइज सबव्यूज" चेक-बॉक्स को बंद करें।

यूआई के पहले संस्करण में यह आवश्यक क्यों नहीं है (जो उस चेकबॉक्स सेट के साथ ठीक काम करता है) एक रहस्य है।

वैसे भी - अगर किसी और की मदद करता है तो यहां दस्तावेज़ित किया गया है।