xcode - ऐडस्यूब्यूव्यू के बाद बाधाएं कैसे जोड़ें, ताकि सबव्यू को पर्यवेक्षण के साथ बदल दिया जाए



macos swift (1)

मेरे पास एक नमूना प्रोजेक्ट है जो समस्या को यहां दर्शाता है I

https://github.com/ericgorr/autolayout_with_addsubview.git

मेरे पास एक दृश्य है जिसे कैलक्यूव कहा जाता है, जिसे मैं प्रोग्राम के लिए ऐप के लिए मुख्य विंडो पर एक दृश्य में एक सबव्यू के रूप में जोड़ना चाहता हूं। जब मैं अपनी विंडो का आकार बदलता हूं , तो मुझे कैल्कव्यू का आकार बदलना है

MainWindowController में windowDidLoad में, मैं ऐसा करके सबव्यू जोड़ता हूं:

let calcViewController  = ELIZCalcView()
let calcView            = calcViewController.view

calcContentView?.addSubview( calcViewController.view )

मैं बाधाओं को जोड़कर कोशिश करता हूं:

let bindings            = [ "calcView": calcView ]

let horizontalContraint:[AnyObject] = NSLayoutConstraint.constraintsWithVisualFormat( "H:|[calcView]|", options: NSLayoutFormatOptions(0), metrics: nil, views: bindings )
let verticalContraint:[AnyObject]   = NSLayoutConstraint.constraintsWithVisualFormat( "V:|[calcView]|", options: NSLayoutFormatOptions(0), metrics: nil, views: bindings )

calcContentView?.addConstraints( horizontalContraint )
calcContentView?.addConstraints( verticalContraint )

अब, किसी को पता है कि उस कोड को ठीक से व्याख्या करने के लिए, यह संभवतः बहुत स्पष्ट है कि यह काम नहीं करेगा मेरे ऐप को चलाने के बाद, मैं विंडो को बिल्कुल भी नहीं बदल सकता। साथ ही, मुझे कंसोल में निम्न त्रुटि संदेश दिखाई देता है:

2015-07-04 16:04:45.019 aocsCalc[5797:3526462] Unable to simultaneously satisfy constraints: (
    "<NSLayoutConstraint:0x618000082440 V:|-(0)-[NSView:0x600000120f00]   (Names: '|':aocsCalc.ELIZHighlightView:0x608000120500 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x618000084100 h=--& v=&-- V:|-(-2)-[NSView:0x600000120f00]   (Names: '|':aocsCalc.ELIZHighlightView:0x608000120500 )>" )

Will attempt to recover by breaking constraint  <NSLayoutConstraint:0x618000082440 V:|-(0)-[NSView:0x600000120f00]   (Names: '|':aocsCalc.ELIZHighlightView:0x608000120500 )>

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.

अगर मैं ऊर्ध्वाधर बाधा को निकालता हूं, तो त्रुटि संदेश दूर हो जाता है और मैं खिड़की को फिर से आकार में बदल सकता हूँ।

तो, मुझे क्या करना चाहिए, ऐसा करने के लिए कैलक्यूव को विंडो के साथ बदल दिया गया है?


अपने कैलक्यूव्यू को जोड़ने से पहले सबव्यू कोड के इस लाइन को सम्मिलित करने का प्रयास करें:

calcView.translatesAutoresizingMaskIntoConstraints = false

इससे आपकी समस्या का समाधान हो जाना चाहिए।

UIView / NSView पर डिफ़ॉल्ट रूप से यह प्रॉपर्टी YES / true पर सेट की गई है और यह ऑटोर्सिस्किंग मुखौटा के आधार पर बाधाओं का स्वयं का सेट बनाता है। ये ऑटो-निर्मित बाधाएं आपके द्वारा कोड में बनाए गए हैं

यह स्पष्ट रूप से इसलिए त्रुटि विवरण में भी कहता है 2 और 3 पंक्तियों पर यह आपको दिखाता है कि एक दृश्य के बारे में ऊर्ध्वाधर बाधाओं के 2 सेट हैं - NSView:0x600000120f00 , जो आपके कैल्सव्यू प्रतीत होता है

<NSLayoutConstraint:0x618000082440 V:|-(0)-[NSView:0x600000120f00] 
<NSAutoresizingMaskLayoutConstraint:0x618000084100 h=--& v=&-- V:|-(-2)-[NSView:0x600000120f00]

वे ऊर्ध्वाधर दोनों हैं सबसे पहले किसी भी मार्जिन के साथ पर्यवेक्षण के शीर्ष पर दृश्य खींचना नहीं चाहता है। दूसरे (स्वचालित रूप से बनाया गया) यह एक छोटे से मार्जिन के साथ तस्वीर करना चाहता है, संभवतः इसे इंटरफ़ेस बिल्डर में कैसे रखा गया है।

अद्यतन करें

एक नया कोको एप्लिकेशन प्रोजेक्ट बनाएं और निम्न कोड पेस्ट करें:

override func viewDidLoad() {
    super.viewDidLoad()

    let view = NSView()
    view.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(view)

    //Making it red just to see a little better. Ignore this two lines.
    view.wantsLayer = true
    view.layer?.backgroundColor = CGColorCreateGenericRGB(1, 0, 0, 1)
    //-----------------------------------------------------------------

    let views = ["view" : view]
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|-[view]-|", options: NSLayoutFormatOptions(0), metrics: nil, views: views))
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[view]-|", options: nil, metrics: nil, views: views))

}

नव निर्मित NSView को देखने के नियंत्रकों के मुख्य दृश्य के साथ मानक हाशिये (8 अंक, इसे दृश्य प्रारूप स्ट्रिंग में "-" वर्णित किया गया है) के साथ बंद कर दिया गया है और मुख्य दृश्य (चित्र देखें) के साथ रीसाइज किया गया है। थोड़ी सी टिप - आपको दृश्य प्रारूप में "एच:" निर्दिष्ट करने की आवश्यकता नहीं है, केवल "वी:"। यह डिफ़ॉल्ट रूप से क्षैतिज है

यह आपको एक अच्छा विचार देनी चाहिए कि प्रोग्रामिंग के तरीके में बाधाएं कैसे जोड़ती हैं। कोड इष्टतम नहीं हो सकता है, ओबजे-सी में कोड और बहुत कम स्विफ्ट पता है।

मैंने आपकी परियोजना डाउनलोड की है त्रुटि शायद आपके जटिल दृश्य पदानुक्रम और xib हेरफेर में कहीं है। लेकिन यह एक पूरी अन्य कहानी है स्क्रॉल दृश्यों के साथ भी सावधानी बरतें, जब यह ऑटोलेआउट की बात आती है तो थोड़ा सा मुश्किल हो जाता है, तो आप उस पर बहुत कुछ कवरेज पा सकते हैं। हैप्पी कोडिंग :)





autolayout