2015-01-08 10 views
11

मैं व्यक्तिगत .xib फाइलों के साथ autolayout के रास्ते में बहुत ढूँढने में सक्षम नहीं किया है किया गया ...autolayout गतिशील .xib देखें ऊंचाई

मैं 3 बार देखा गया है कि एक स्टैंडअलोन .xib फ़ाइल मिल गया है - एक हेडर व्यू (जिसमें दो लेबल होते हैं), एक इनपुट, और एक पाद लेख (जिसमें दो बटन होते हैं)। यह इस तरह दिखता है:

enter image description here

हैडर दृश्य में लेबल की कमी है जो शीर्ष लेख को देखने के ऊर्ध्वाधर आकार को प्रभावित करना चाहिए, और बदले में पूरे दृश्य के आकार का। उपशीर्षक 0 लाइनों वाला एक लेबल है, जिसका अर्थ है कि यह बहु-रेखा और गतिशील है। बाकी सब कुछ क्षैतिज बाधाओं के साथ पर्यवेक्षण और शीर्ष बाधाओं को भाई (या हेडर व्यू के मामले में पर्यवेक्षण) के साथ सेट ऊंचाई है।

मुद्दा मैं कर रहा हूँ कि जब मैं प्रदर्शन के लिए कोड में इस .xib फ़ाइल लोड है, ऊंचाई हमेशा स्थिर क्या Xcode के निरीक्षकों में परिभाषित किया गया है के आधार पर है। चौड़ाई के आधार पर पूरे दृश्य गतिशीलता की ऊंचाई बनाना संभव है (जो गतिशील लेबल ऊंचाई को प्रभावित करता है और इसलिए शेष दृश्य)?

उदाहरण के लिए - अगर मैं .xib से इस दृश्य लोड और 300 के लिए अपनी चौड़ाई सेट, मैं कैसे तो यह उसकी ऊंचाई का आकार बदलने के गतिशील लेबल की नई ऊंचाई को समायोजित करने के लिए क्या है? क्या मुझे इस आकार को परिभाषित करने के लिए intrinsicContentSize विधि का उपयोग करने की आवश्यकता है?

उत्तर

13

ज्यादा प्रयोग और पढ़ने के बाद, मैं इस सवाल का जवाब मिल गया है। जब निर्माता के कुछ प्रकार में .xib (मेरे मामले एक वर्ग स्तर सुविधा विधि में) लोड हो रहा है, तो आप [view setTranslatesAutoresizingMaskIntoConstraints:NO]; उदाहरण के लिए फोन करना सुनिश्चित करें, मैं निम्नलिखित किया है:

+ (InputView *)inputViewWithHeader:(NSString *)header subHeader:(NSString *)subHeader inputValidation:(ValidationBlock)validation 
{ 
    InputView *inputView = [[[NSBundle mainBundle] loadNibNamed:@"InputView" owner:self options:nil] lastObject]; 
    if ([inputView isKindOfClass:[InputView class]]) { 
     [inputView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
     [inputView configureWithHeader:header subHeader:subHeader inputValidation:validation]; 
     [inputView layoutIfNeeded]; 
     [inputView invalidateIntrinsicContentSize]; 
     return inputView; 
    } 
    return nil; 
} 

फिर, यह करने के लिए आवश्यक है layoutSubviews और intrinsicContentSize ओवरराइड करें। जबकि अधिभावी intrinsicContentSize की कमी और subviews के आधार पर आकार की गणना करने के लिए मुझे अनुमति देता है अधिभावी layoutSubviews, मुझे मेरे लेबल के preferredMaxLayoutWidth स्थापित करने के लिए अनुमति देता है!

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    self.subHeaderLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds); 
    [super layoutSubviews]; 
} 

- (CGSize)intrinsicContentSize { 
    CGFloat height = self.headerView.bounds.size.height; 
    height += self.headerInputSpacer.constant; 
    height += self.inputField.bounds.size.height; 
    height += self.inputButtonSpacer.constant; 
    height += self.buttonView.bounds.size.height; 
    CGSize size = CGSizeMake([UIScreen mainScreen].bounds.size.width - 20, height); 
    return size; 
} 

मुझे यकीन है कि वहाँ ऐसा कर को यह बेहतर बनाने के तरीके, या बेहतर तरीके हैं, लेकिन अब के लिए यह कम से कम आकार की सही ढंग से है: यहाँ उन के अपने कार्यान्वयन है! उन विचारों के लिए बहुत उपयोगी है जिनके पास उपयोगकर्ता परिभाषित फ्रेम नहीं होना चाहिए।

+0

आप 'layoutSubviews' को दो बार क्यों बुला रहे हैं? –

+0

मैंने कोशिश की, लेकिन मेरे लिए काम नहीं किया। क्या आप गिटहब में डेमो पेस्ट कर सकते हैं? बहुत बहुत धन्यवाद ~ – Neko

+0

@Neko कृपया नीचे सूचीबद्ध मेरे समाधान का प्रयास करें। – JackyW

0

मैं फंस गया था के रूप में आप इस प्रकार थे: सबसे अच्छा अभी भी जब पूरा टेक्स्ट प्रदर्शित किया जाता है लेबल की ऊंचाई की गणना करने के लिए है। यदि आप इसकी तलाश में हैं, तो आपको यहां एक अच्छा समाधान मिलेगा: How to find UILabel's number of Lines

एक दृश्य के अंदर सब कुछ एम्बेड करें:

+1

यह टिप्पणी होना चाहिए – ketan

0

यह मेरा दृष्टिकोण (स्विफ्ट संस्करण) है। आपका xib पदानुक्रम होना चाहिए:

  • आपका xib
    • देखें
      • बाकी सब कुछ, अपने लेबल, बटन आदि

देखें की बाधा (देखें) शीर्ष करने के लिए रोके चाहिए, अग्रणी और superview (अपने xib) को पीछे चल, और अपने "सब कुछ" अंदर, superview को एक वस्तु के निचले स्थिर होना चाहिए ।

अपने कोड में:

लोड निब

nib.frame.size.width = 80 // अपने वांछित चौड़ाई यहां

nib.label.text = "हैलो दुनिया" सेट//) सेट यहाँ गतिशील पाठ

nib.layoutIfNeeded (// यह गणना करने और ऊंचाइयों सेट हो जाएगा तदनुसार

nib.frame.size.height = nib.view.frame.height + 16 // 16 ऑटो लेआउट का शीर्ष अंतर और नीचे अंतर का कुल

मेरे मामले में, मैं इस xib को संग्रह दृश्य कक्ष में लोड कर रहा हूं, xib की ऊंचाई को गतिशील रूप से समायोजित किया जाना है, और चौड़ाई का पालन करना है सेल की चौड़ाई। अंत में, उपरोक्त कोड ब्लॉक संग्रह दृश्य के मेरे cellForItemAt विधि के अंदर है।

उम्मीद है कि यह मदद करता है।

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