2012-10-08 21 views
14

मेरे पास एक ऐसा दृश्य है जो कोड में अपने सबव्यूज़ का लेआउट करता है। लेआउट ऑटो लेआउट के लिए बहुत जटिल है, और ऑटो लेआउट लेआउट कोड तोड़ता है। क्या इस दृश्य के सबव्यूव को अकेले छोड़ने के लिए ऑटो लेआउट को मजबूर करने का कोई तरीका है? मैंने लेआउट सबव्यूव्स ओवरराइड करने का प्रयास किया है, लेकिन कोई खुशी नहीं है।एक ही दृश्य के लिए ऑटो लेआउट से बाहर निकलना?

किसी भी मदद के लिए धन्यवाद।

उत्तर

5

ऑटो-लेआउट प्रति स्टोरीबोर्ड या एक्सआईबी सक्षम या अक्षम है। यदि आपका विचार अपने स्वयं के XIB में है, तो आप उस XIB के लिए ऑटो-लेआउट अक्षम कर सकते हैं। यदि आपके एक्सआईबी में अन्य विचार हैं जो ऑटो लेआउट पर भरोसा करते हैं, तो आपको एक अलग समाधान मिलना होगा।

+1

इसे अपने स्वयं के एनआईबी में डालने का एकमात्र समाधान प्रतीत होता है। –

+0

हाँ यह बेकार है आप इसे प्रति दृश्य चालू या बंद नहीं कर सकते हैं। – Flea

+0

* जब तक आप इसे करते हैं * ऑटो लेआउट इंजन उनके साथ किया जाता है (नीचे मेरा जवाब देखें) के बाद * आप * दृश्यमान दृश्यों को मैन्युअल रूप से (यानी अपने फ्रेम सेट कर सकते हैं) कर सकते हैं। – wcochran

2

डब्ल्यूडब्ल्यूडीसी वीडियो में जवाब मिला। लेआउट सबव्यूव्स ऑटो लेआउट के तहत ऐसा नहीं करता है जैसा कि पहले किया गया था। यह ऑटो लेआउट को होने से नहीं रोकता है, बल्कि लेआउट के दौरान बाधाओं को जोड़ने/बदलने/निकालने का अवसर है।

कल रात मैंने कस्टम दृश्य को एक अलग एनआईबी में ले जाने की कोशिश की और यह एकमात्र समाधान प्रतीत होता है।

2

You can mix auto layout and manual layout!

जब तक कोई भी किसी दृश्य के subviews केकिसी भी ऑटो लेआउट बाधाओं है कि एक और ऑटो लेआउट उस दृश्य पर पारित ट्रिगर करेगा में शामिल कर रहे हैं, तो आप layoutSubviews ओवरराइड और सेट कर सकते हैं मैन्युअल रूप से प्रत्येक सबव्यू पर फ्रेम:

class MyView : UIView { 

    // 
    // mySubview is not involved in any constraints 
    // that would trigger another layout pass. 
    // e.g., no explicit constraints set in IB. 
    // 
    @IBOutlet weak var mySubview: UIView! 

    override func layoutSubviews() { 
     super.layoutSubviews() // let auto layout engine run first 

     // 
     // Auto layout engine now done with this view so we can 
     // set the frames how ever we wish since we have the last 
     // word! 
     // 
     mySubview.frame = CGRectMake(...) 
     ... 

    } 

} 

कारण यह है किके बादकहा जाता है, किसी भी सबव्यूव पर फ्रेम बदलना एक और लेआउट पास ट्रिगर नहीं करता है (सबव्यू से संबंधित सभी बाधाएं संतुष्ट हैं और ऑटो लेआउट इंजन उनके साथ किया जाता है); इसलिए इस विधि को इसके सबव्यूज़ की स्थिति पर अंतिम शब्द मिलता है!

  • ध्यान दें कि MyView उदाहरणों संबंधित हो सकता है ऑटो लेआउट की कमी की स्थापना की और सब कुछ ठीक काम करता है।

  • आईबी कोई चेतावनी जारी करता है जब तक आप subviews पर किसी भी बाधाओं सेट नहीं करते हैं।

+0

मैकोज़ पर, सबक्लास के लिए विधि 'लेआउट' होगी। – Demitri

संबंधित मुद्दे