ऑटोलैयूट फेंकता में सबव्यू एक्स को केंद्रित करता है "बाधा के लिए तैयार नहीं"


82

मेरे पास एक कस्टम उविवि उपवर्ग है जिसे एक निब के माध्यम से आरंभीकृत किया जा रहा है।

में -awakeFromNib, मैं एक सबव्यू बना रहा हूँ और इसे अपने पर्यवेक्षण केंद्र में रखने का प्रयास कर रहा हूँ।

[self setInteralView: [[UIView alloc] init]];
[[self internalView] addConstraint: [NSLayoutConstraint constraintWithItem: [self internalView]
                                                                 attribute: NSLayoutAttributeCenterX
                                                                 relatedBy: NSLayoutRelationEqual
                                                                    toItem: self
                                                                 attribute: NSLayoutAttributeCenterX
                                                                multiplier: 1
                                                                  constant: 0]];

यह टूटता है, और निम्न आउटपुट का कारण बनता है:

2013-08-11 17:58:29.628 MyApp[32414:a0b] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0xc1dcc80 UIView:0xc132a40.centerX == MyView:0xc1315a0.centerX>
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2013-08-11 17:58:29.630 MyApp[32414:a0b] View hierarchy unprepared for constraint.
    Constraint: <NSLayoutConstraint:0xc1dcc80 UIView:0xc132a40.centerX == MyView:0xc1315a0.centerX>
    Container hierarchy: 
<UIView: 0xc132a40; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0xc132bc0>>
    View not found in container hierarchy: <MyView: 0xc1315a0; frame = (-128 -118; 576 804); layer = <CALayer: 0xc131710>>
    That view's superview: <UIView: 0xc131a70; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0xc131b50>>

जवाबों:


95

जैसा कि त्रुटि में कहा गया है, आपको बाधा को एक दृश्य में जोड़ना होगा जैसे कि बाधा में शामिल विचार वह दृश्य है जिसे आप इसे या उस दृश्य के उप-भाग में जोड़ रहे हैं। उपरोक्त आपके कोड के मामले में, आपको उस बाधा को जोड़ना चाहिए self, बजाय [self internalView]। लिखित रूप में काम नहीं करने का कारण यह है कि बाधा ( self) में शामिल विचारों में से एक दृश्य पदानुक्रम में है यदि आप केवल [self internalView]और नीचे मानते हैं)।

अधिक विवरण के लिए, विधि पर प्रलेखन के चर्चा अनुभाग देखें addConstraint:

यहाँ आपके सुझाव के अनुसार आपकी लाइन ऑफ़ कोड है:

UIView* internalView = [[UIView alloc] initWithFrame:CGRectZero];
internalView.translatesAutoresizingMaskIntoConstraints = NO;
[self setInternalView:internalView];

[self addConstraint: [NSLayoutConstraint constraintWithItem: [self internalMapView]
                                         attribute: NSLayoutAttributeCenterX
                                         relatedBy: NSLayoutRelationEqual
                                         toItem: self
                                         attribute: NSLayoutAttributeCenterX
                                         multiplier: 1
                                         constant: 0]];

यह दावा करने में मुझे एक त्रुटि देता है Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want.और फिर यह टूट जाता है<NSLayoutConstraint:0x126ad4c0 UIView:0xadd2e20.centerX == MyView:0xadd19b0.centerX>
पैट्रिक पेरीनी

1
सबसे अधिक संभावना है क्योंकि आपने ऑटो रिसर्जिंग मास्क को बाधाओं में बदलने का अनुवाद अक्षम नहीं किया था। मैं ऐसा करने के लिए ऊपर अपना कोड अपडेट करूंगा। आपको संभवतः इसे दिखाई देने के लिए चौड़ाई / ऊंचाई की बाधाओं को भी जोड़ना होगा, और मैं लेआउट को अच्छी तरह से परिभाषित करने के लिए केंद्र Y पर एक बाधा या स्वयं के ऊपर / नीचे बाधा के कुछ प्रकार को जोड़ने की सलाह दूंगा।
चार्ल्स ए।

तो आप खिचड़ी भाषा की तरह लेआउट है @"V:|[v]|":? जैसा कि यह एक पर्यवेक्षक को संदर्भित करेगा?
सैम

1
@Sam यह एक वैध बाधा है, लेकिन यह प्रतिनिधित्व करने वाले दृश्य को केंद्र में नहीं रखेगा [v], यह आपको मानक आकार के ऊपरी और निचले अवरोधों [v]और उसके पर्यवेय के बीच मानक आकार प्रदान करेगा। मेरा मानना ​​है कि आपको इसे पर्यवेक्षक के साथ जोड़ना होगा।
चार्ल्स ए।

8
एक सरल अंगूठे का नियम: किसी भी बाधाएं जो किसी दृश्य के आकार से संबंधित होती हैं, उन्हें उसी दृश्य में जोड़ा जाना चाहिए और इसके स्थान से संबंधित किसी भी बाधा को इसके माता-पिता में जोड़ा जाना चाहिए।
दीपक जीएम

117

यहां आने वाले अन्य लोगों के लिए: मुझे यह त्रुटि मिली, क्योंकि मैंने पदानुक्रम में सब-वर्सेस को जोड़ने से पहले बाधाओं को जोड़ा था।


धन्यवाद, आपने मुझे बहुत समय बचाया!
Stas

यह इस विफलता का सबसे आम कारण है जिस पर मैंने अब तक ध्यान दिया है।
अयान सेनगुप्ता

ठीक है और जब आप ऐसा करते हैं कि constraintWithItem: youViewआइटम उसमें मौजूद नहीं है!
नज़ीर

36

संक्षिप्त उत्तर : स्वैप अभिभावक और बच्चे का दृश्य।
मान लिया गया selfहै कि मूल दृश्य:

  • बुरा :[subview addConstraint [NSLayoutConstraint constraintWithItem:self...

  • अच्छा :[self addConstraint [NSLayoutConstraint constraintWithItem:subview...


तीव्र

subview.translatesAutoresizingMaskIntoConstraints = false
self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(
    "H:|-0-[subview]-0-|",
    options: .DirectionLeadingToTrailing,
    metrics: nil,
    views: ["subview":subview]))

Obj सी


10

अतिरिक्त सुझाव:

मेरे पास एक नया विकसित ऐप है जो iOS7 पर ठीक चल रहा है लेकिन iOS8 पर त्रुटि मिलती है "व्यू पदानुक्रम बाधा के लिए तैयार नहीं है"।

पढ़ें कुछ अन्य पोस्ट में कहा गया है कि (उप) विचार बाधाओं को बनाने से पहले जोड़ना होगा। मैंने ऐसा किया लेकिन फिर भी त्रुटि हुई।

तब मुझे पता चला कि मुझे बाधाओं का निर्माण करना चाहिए - (शून्य) viewDidAppear बजाय viewDidLoad


2
जब viewDidAppear()कहा जाता है, तो दृश्य पहले से ही उपयोगकर्ता को दिखाई देता है। यदि बाधाओं को संशोधित करने से पहले यह होना चाहिए, में viewWillLayoutSubviews()। यहाँ जीवनचक्र के और अधिक: medium.com/@SergiGracia/…
maganap

6

यह एक पुराना प्रश्न है लेकिन मैं इस पंक्ति को डॉक्स से इंगित करना चाहता हूं:

IOS 8.0 या बाद के लिए विकसित करते समय, सीधे कॉलऑनस्ट्रैटिन (_ :) विधि को कॉल करने के बजाय सही करने के लिए बाधा की आय गुणक सेट करें। IsActive गुण स्वचालित रूप से सही दृष्टिकोण से बाधा जोड़ता है और हटाता है।

बहुत कम से कम, यह विफलता के एक बिंदु को हटा देगा क्योंकि आपको अब गलत दृश्य पर कॉलकॉन्स्ट्रेंट कॉल करने के बारे में चिंता करने की आवश्यकता नहीं है


2

मेरे मामले में, वर्तमान में बनाए गए दृश्य के बजाय रूट बाधाओं का एक कंटेनर के रूप में उपयोग करके इसे हल किया गया था।

मेरा मतलब है, viewController के अंदर का उपयोग करें

view.addConstraints([leftConstraintImage, topConstraintImage]) के बजाय imageView.addConstraints...


1

जैसा कि @CharlesA उनके जवाब में बताता है कि समस्या यह है कि आप जो दृश्य जोड़ रहे हैं वह उचित दृश्य पदानुक्रम में नहीं है। उसका उत्तर एक अच्छा है, लेकिन मैं एक विशेष उपयोग-मामले के लिए कुछ विस्तार से फेंकने जा रहा हूं, जो मेरे लिए यह समस्या पैदा कर रहा है:

मैं ऐसा तब करता था जब बाधाओं को एक दृश्य में जोड़ने का प्रयास करता था जिसका दृश्य नियंत्रक मैंने तुरंत उपयोग किया था instantiateViewControllerWithIdentifier। समस्या को हल करने के लिए, मैंने उपयोग किया [childViewController didMoveToParentViewController:self]। इसने दृश्य को पदानुक्रम में जोड़ा जो मेरे अवरोध द्वारा संदर्भित था।


0

पहले अपना सब-व्यू जोड़ें और फिर इस तरह से अपनी अड़चनें जोड़ें

addSubview(yourSubViewHere)
yourSubViewHere.translatesAutoresizingMaskIntoConstraints = false

addConstraint(NSLayoutConstraint(....
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.