2013-07-21 8 views
5

में ऑटोलायआउट बाधाओं का पालन नहीं करते हैं, मैं UIScrollView पर एक UIView जोड़ रहा हूं और इसे कुछ मार्जिन को छोड़कर क्षैतिज स्थान भरता हूं। मेरे दृश्य बाधा इस तरह दिखता है:UIView UIScrollView

@"|-16-[theLineView]-16-|" 

मैं तो यह एक पंक्ति के रूप में दिखाई देगा एक दृश्य पिक्सेल उच्च बना दिया है, और दो पाठ लेबल के बीच रख दिया:

@"V:[someOtherStuff]-[aTextLabel]-[theLineView]-[anotherLabel]" 

हालांकि, मैं लग रहा है कि रेखा की चौड़ाई केवल ऊपर/नीचे के सबसे लंबे लेबल की चौड़ाई तक फैली हुई है।

यह क्यों होगा?

पी.एस मैं इस http://developer.apple.com/library/ios/#technotes/tn2154/_index.html

enter image description here

कोड

पढ़ा है यहाँ एक परीक्षण परियोजना है कि आईपैड सिम पर इस समस्या का दर्शाती से देखने नियंत्रक कोड की सम्पूर्णता है।

- (void)viewDidLoad 

{ [सुपर व्यूडिडलोड];

self.scrollView = [[UIScrollView alloc] init]; 
self.scrollView.translatesAutoresizingMaskIntoConstraints = NO; 
self.scrollView.backgroundColor = [UIColor greenColor]; 
[self.view addSubview:self.scrollView]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[scrollView]|" 
                   options:0 
                   metrics:0 
                    views:@{@"scrollView":self.scrollView}]]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" 
                    options:0 
                    metrics:0 
                    views:@{@"scrollView":self.scrollView}]]; 

self.line1 = [[UIView alloc] init]; 
self.line2 = [[UIView alloc] init]; 
self.label1 = [[UILabel alloc] init]; 
self.label2 = [[UILabel alloc] init]; 
self.label3 = [[UILabel alloc] init]; 

for (UILabel *label in @[self.label1, self.label2, self.label3]) 
{ 
    label.text = @"I am a label and I am long enough that I can be multiline on an iphone but single on ipad"; 
} 

for (UIView *view in @[self.line1, self.line2, self.label1, self.label2, self.label3]) 
{ 
    view.translatesAutoresizingMaskIntoConstraints = NO; 
    view.backgroundColor = [UIColor redColor]; 
    [self.scrollView addSubview:view]; 
} 

//horizontal layout - all views/labels should fill the horizontal space expect for margin 
for (UIView *view in @[self.line1, self.line2, self.label1, self.label2, self.label3]) 
{ 
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-16-[view]-16-|" 
                    options:0 
                    metrics:0 
                    views:@{@"view":view}]; 
    [self.scrollView addConstraints:constraints]; 
} 

//vertical layout - stack em up 
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[lab1]-[line1(==1)]-[lab2]-[line2(==1)]-[lab3]-|" 
                    options:0 
                    metrics:0 
                    views:@{@"lab1":self.label1, @"line1":self.line1, @"lab2":self.label2, @"line2":self.line2, @"lab3":self.label3}]]; 

}

+0

क्या आपके 1px 'UIView' पर कोई अन्य बाधा है? – Yazid

+0

[देखें] वही दृश्य [theLineView] के रूप में है? क्या आपके पास विकल्प पैरामीटर में कोई संरेखण विकल्प सेटअप है? – rdelmar

+0

विकल्प पैरामीटर में कोई अन्य बाधा या कुछ भी नहीं। मैं देखूंगा कि क्या मैं एक परीक्षण परियोजना में पुन: पेश कर सकता हूं। हां वे विचार समान हैं, स्निपेट को सही किया गया है। –

उत्तर

6

UIScrollView स्वचालित रूप से इसके अंदर विचारों फिट करने के लिए सिकुड़ता है। आपको चौड़ाई को बिल्कुल कहीं भी सेट करने की आवश्यकता है।

सिफारिश की रणनीति:

  1. पूरी तरह से अपनी मूल-व्यू के अंदर scrollview fixiate की कमी का उपयोग कर (प्रमुख, अनुगामी, ऊपर, नीचे)।
  2. UIScrollView के अंदर एक UIView बनाएं और इसके अंदर आपको जो भी चाहिए उसे रखें।
  3. बाधाओं को सेट करें ताकि UIView सामग्री-दृश्य के रूप में कार्य करे (इसका मतलब है कि यह सभी तत्वों को शामिल करने के लिए काफी बड़ा है)। अंतर्निहित सामग्री-आकार, सिकुड़-प्रतिरोध और बाधाओं वाले तत्वों की श्रृंखला का उपयोग करें। परिणामी लेआउट अच्छी तरह से परिभाषित और अद्वितीय होना चाहिए (इसका मतलब है कि यदि आप बाहर की सभी बाधाओं को दूर करना चाहते थे, तो लेआउट अभी भी काम करेगा)।
  4. UIView की सीमाओं को उनके पर्यवेक्षण के साथ कनेक्ट करें (जो UIScrollView की वास्तविक सामग्री-दृश्य है, UIScrollView नहीं!)।

यदि आप इंटरफ़ेस-निर्माता (यह संभव है) में ऐसा करते हैं, तो आपको उस दृश्य में कुछ स्पर्श करने पर अपनी बाधाओं को दोबारा जांचना होगा। और स्पर्श से मेरा मतलब है "चयन करें" न केवल "संशोधित करें"।

+0

मेरे लिए काम नहीं किया, कैसे मैं स्क्रॉल व्यू की पूरी चौड़ाई को भरने के लिए UIView सेट करने के लिए? – AndiDog

+0

जैसा कि मैंने कहा था: सामग्री दृश्य हमेशा पूर्ण स्क्रॉल दृश्य भरता है, क्योंकि scrollView नीचे गिर जाता है। आपको चौड़ाई को अंदर सेट करना है। आपके उदाहरण में, "| -16- [देखें] -16- |" से प्रारूप बदलना "| -16- [देखें (288)] - 16- |" आपको एक अच्छा परिणाम देना चाहिए। –

+3

यह काम करता है। संख्या 4 मेरी राय में बेहतर दृष्टिकोण है क्योंकि यह सरल है और किसी भी जादू संख्या से बचाता है (जिसका अर्थ है कि यह रोटेशन इत्यादि का समर्थन करता है)। –

2

एक कार्य समाधान मिला जो आपके उपयोग के मामले के लिए भी काम करना चाहिए। here देखें।

2

पेट्रिक शेन्के के उत्तर की संख्या 4 पर विस्तार; क्योंकि scrollView का सामग्री आकार तरल पदार्थ है, इसके किनारों पर एक आंतरिक दृश्य पिन करना सिर्फ दृश्य की चौड़ाई निर्धारित करने के लिए काम नहीं करता है। आपका बायां तरफ पिन काम करेगा, लेकिन दोनों नहीं करेंगे। अगले स्तर के कंटेनर के आधार पर आपके दृश्य की चौड़ाई की गणना करना रास्ता है।जब तक आपके self.scrollView को उसके कंटेनर पर पिन किया गया है (जिसे मैं containerView पर कॉल करता हूं), कोड की यह पंक्ति आप जो चाहते हैं उसे पूरा कर लेगी। (मैं इस समाधान की भंगुरता की हद तक परीक्षण नहीं किया)

// Pin view's width to match the scrollView container's width 
// -32 constant offset for margins 
[containerView addConstraint: 
    [NSLayoutConstraint constraintWithItem:view 
           attribute:NSLayoutAttributeWidth 
           relatedBy:NSLayoutRelationEqual 
            toItem:containerView 
           attribute:NSLayoutAttributeWidth 
           multiplier:1.0f 
           constant:-32]]; 
0

मैं एक साधारण बाधा आधारित तरीका यह है, पाया: क्षैतिज बाधाओं के लिए अपने for पाश को यह पंक्ति जोड़ें

[email protected]"H:|-16-[view]-16-|"... // (your original constraint) 

[self.scrollView addConstraint: 
    [NSLayoutConstraint constraintWithItem:view 
           attribute:NSLayoutAttributeCenterX 
           relatedBy:NSLayoutRelationEqual 
            toItem:self.scrollView 
           attribute:NSLayoutAttributeCenterX 
           multiplier:1.0f 
           constant:0.0f]]; 

यह दृश्य के दूसरी तरफ view फैलाता है। यह शायद सामग्री के लिए आदर्श नहीं है जो क्षैतिज स्क्रॉल करता है, लेकिन लंबवत काम करना चाहिए।

मुझे एहसास है कि यह एक साल बाद खत्म हो गया है, लेकिन यह patric.schenke के उत्तरों (जो अच्छे और अधिक मजबूत हैं) की तुलना में एकल आयामी स्क्रॉलिंग उपयोग मामले के लिए आसान है।