कोड में ऑटो लेआउट का उपयोग करते समय, फ्रेम सेट करना कुछ भी नहीं करता है। तो यह तथ्य कि आपने ऊपर के दृश्य पर 200 की चौड़ाई निर्दिष्ट की है, जब आप उस पर अड़चन स्थापित करते हैं तो इसका कोई मतलब नहीं है। किसी दृश्य के अवरोध के लिए असंदिग्ध होने के लिए, उसे चार चीजों की आवश्यकता होती है: एक एक्स-पोजीशन, एक वाई-पोजीशन, एक चौड़ाई और किसी भी अवस्था के लिए ऊँचाई।
वर्तमान में ऊपर दिए गए कोड में, आपके पास केवल दो (ऊंचाई, पर्यवेक्षण के सापेक्ष, और y- स्थिति, पर्यवेक्षक के सापेक्ष) है। इसके अतिरिक्त, आपके पास दो आवश्यक बाधाएं हैं जो इस बात पर निर्भर करती हैं कि दृश्य के पर्यवेक्षण की बाधाएं सेटअप कैसे हैं। यदि पर्यवेक्षण में एक आवश्यक बाधा होती है जो निर्दिष्ट करती है कि यह ऊँचाई 748 से कुछ कम है, तो आपको "असंतोषजनक बाधा" अपवाद मिलेगा।
तथ्य यह है कि आप बाधाओं को स्थापित करने से पहले दृश्य की चौड़ाई निर्धारित करते हैं का मतलब कुछ भी नहीं है। यह पुराने फ्रेम को भी ध्यान में नहीं रखेगा और उन सभी बाधाओं के आधार पर एक नए फ्रेम की गणना करेगा जो उसने उन विचारों के लिए निर्दिष्ट किया है। कोड में ऑटोलॉययूट के साथ काम करते समय, मैं आमतौर पर केवल initWithFrame:CGRectZero
या केवल उपयोग करके एक नया दृश्य बनाता हूं init
।
आपके प्रश्न में वर्णित लेआउट के लिए आवश्यक बाधा सेट बनाने के लिए, आपको पूरी तरह से निर्दिष्ट लेआउट देने के लिए चौड़ाई और एक्स-स्थिति को बाध्य करने के लिए कुछ क्षैतिज बाधाओं को जोड़ना होगा:
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:[myView(==200)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
वर्टिकल कॉन्स्टेंट के साथ शुरू होने वाले इस लेआउट को पढ़ते हुए मौखिक रूप से बताया गया है:
myView मानक स्थान के बराबर शीर्ष और नीचे की गद्दी के साथ अपने पर्यवेक्षण की ऊंचाई को भरेगा। myView के पर्यवेक्षण में 748's की न्यूनतम ऊंचाई है। myView की चौड़ाई 200pts है और इसके पर्यवेक्षण के खिलाफ मानक स्थान के बराबर एक सही पैडिंग है।
यदि आप सुपरवाइवे की ऊंचाई को बाधित किए बिना पूरे पर्यवेक्षक की ऊंचाई को भरने के लिए दृश्य को पसंद करेंगे, तो आप (>=748)
दृश्य प्रारूप पाठ में पैरामीटर को छोड़ देंगे । यदि आपको लगता है कि (>=748)
पैरामीटर को ऊँचाई देने की आवश्यकता है - आप इस उदाहरण में नहीं हैं: |
बार के साथ पर्यवेक्षक के किनारों पर दृश्य को पिन करना ( ) या स्पेस के साथ बार ( |-
,-|
) सिंटैक्स के , आप अपने दृश्य को y दे रहे हैं -पोजिशन (एक किनारे पर दृश्य को पिन करना), और ऊँचाई के साथ एक वाई-पोज़िशन (दोनों किनारों पर दृश्य को पिन करना), इस प्रकार दृश्य के लिए आपके बाधा सेट को संतुष्ट करता है।
आपके दूसरे प्रश्न के संबंध में:
का उपयोग करना NSDictionaryOfVariableBindings(self.myView)
(यदि आपके पास myView के लिए एक संपत्ति सेटअप था) और अपने VFL self.myView
में अपने VFL पाठ में उपयोग करने के लिए फीडिंग , तो आपको संभवतः एक अपवाद मिलेगा जब ऑटोलयूट आपके VFL पाठ को पार्स करने की कोशिश करता है। इसे शब्दकोश कुंजियों में डॉट नोटेशन और उपयोग करने की कोशिश करने वाले सिस्टम के साथ करना है valueForKeyPath:
। इसी तरह के सवाल और जवाब के लिए यहां देखें ।