स्क्रॉल दृश्यों के साथ बाधाएं अन्य विचारों के मुकाबले थोड़ा अलग तरीके से काम करती हैं। contentView
और superview
(scrollView
) के बीच की बाधा scrollView
के contentSize
पर है, न कि frame
पर। यह भ्रमित प्रतीत हो सकता है, लेकिन यह वास्तव में काफी उपयोगी है, जिसका अर्थ है कि आपको कभी भी contentSize
समायोजित करना नहीं है, बल्कि contentSize
स्वचालित रूप से आपकी सामग्री के अनुरूप समायोजित हो जाएगा। इस व्यवहार का वर्णन Technical Note TN2154 में किया गया है।
यदि आप स्क्रीन पर contentView
आकार को परिभाषित करना चाहते हैं या ऐसा कुछ है, तो आपको contentView
और मुख्य दृश्य के बीच एक बाधा जोड़नी होगी, उदाहरण के लिए। यह स्वीकार्य रूप से, स्क्रॉलव्यू में सामग्री डालने के लिए विरोधाभासी है, इसलिए शायद मैं इसे सलाह नहीं दूंगा, लेकिन यह किया जा सकता है।
इस अवधारणा को समझने के लिए, कि contentView
के आकार, उसकी सामग्री के द्वारा संचालित किया जाएगा scrollView
की bounds
से नहीं, अपने contentView
में लेबल जोड़ने: अब
UIScrollView* scrollView = [UIScrollView new];
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
scrollView.backgroundColor = [UIColor redColor];
[self.view addSubview:scrollView];
UIView* contentView = [UIView new];
contentView.translatesAutoresizingMaskIntoConstraints = NO;
contentView.backgroundColor = [UIColor greenColor];
[scrollView addSubview:contentView];
UILabel *randomLabel = [[UILabel alloc] init];
randomLabel.text = @"this is a test";
randomLabel.translatesAutoresizingMaskIntoConstraints = NO;
randomLabel.backgroundColor = [UIColor clearColor];
[contentView addSubview:randomLabel];
NSDictionary* viewDict = NSDictionaryOfVariableBindings(scrollView, contentView, randomLabel);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics:0 views:viewDict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics:0 views:viewDict]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:0 views:viewDict]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:0 views:viewDict]];
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[randomLabel]-|" options:0 metrics:0 views:viewDict]];
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[randomLabel]-|" options:0 metrics:0 views:viewDict]];
आप करेंगे देखें कि contentView
(और, contentSize
scrollView
) मानक मार्जिन के साथ लेबल फिट करने के लिए समायोजित किए गए हैं। और क्योंकि मैंने लेबल की चौड़ाई/ऊंचाई निर्दिष्ट नहीं की है, जो उस लेबल में आपके द्वारा रखे गए पाठ के आधार पर समायोजित होगी।
आप contentView
भी मुख्य दृश्य की चौड़ाई के समायोजित करना चाहते हैं, तो आप ऐसा तरह फिर से परिभाषित कर सकता है आपके viewDict
, और फिर इन अतिरिक्त की कमी (सभी दूसरों के अलावा, ऊपर) जोड़ें:
UIView *mainView = self.view;
NSDictionary* viewDict = NSDictionaryOfVariableBindings(scrollView, contentView, randomLabel, mainView);
[mainView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[contentView(==mainView)]" options:0 metrics:0 views:viewDict]];
scrollviews में बहु लेबल के साथ एक known issue (bug?) है, कि अगर आप इसे पाठ की मात्रा के अनुसार आकार बदलने के लिए चाहते हैं, आप इस तरह के रूप में, हाथ से कुछ सफ़ाई करना है:
dispatch_async(dispatch_get_main_queue(), ^{
randomLabel.preferredMaxLayoutWidth = self.view.bounds.size.width;
});
मैं अगर पाठ बहुत पर फिट करने के लिए लंबा है लेबल पाने के लिए खड़ी विस्तार करने के लिए नहीं कर पा रहे एक पंक्ति। मैंने लाइनों की संख्या 0 पर सेट की है, और लाइन ब्रेकमोड को NSLineBreakByWordWrapping पर सेट किया है। क्या मैं कुछ भूल रहा हूँ? – rdelmar
इसके अतिरिक्त, मैंने सामग्री की चौड़ाई को पिन करने के लिए आपके उत्तर में अंतिम पंक्ति को जोड़ा है स्क्रीन की चौड़ाई को देखें (अन्यथा सामग्री दृश्य की चौड़ाई लंबे पाठ को समायोजित करने के लिए पर्याप्त है)। यदि मैं स्पष्ट रूप से ऊंचाई की बाधा वाले लेबल की ऊंचाई निर्धारित करता हूं, तो यह काम करता है। – rdelmar
हाँ, मैट ने इस समस्या के लिए [कुछ कार्य-आस-पास] खोजा (http://stackoverflow.com/questions/13149733/ios-autolayout-issue-with-uilabels-in-a-resizing-parent-view) मल्टीलाइन लेबल की बग। मैंने उनमें से एक को मेरे उत्तर के नीचे जोड़ा है। एक पूरी तरह असंतोषजनक समाधान। ऐसा लगता है कि आपको हार्डकोडिंग मान या इस क्लूडी वर्कअराउंड के बीच चयन करना है। – Rob