2014-10-23 11 views
7

पर एक अलग आकार है, मैंने एक व्यू कंट्रोलर लागू किया जो केवल एक छवि प्रदर्शित करता है और उपयोगकर्ता को छवि के चारों ओर ज़ूम इन/पैन करने की अनुमति देता है। यह आईओएस 7 पर बहुत अच्छा काम करता है, लेकिन आईओएस 8 पर स्क्रॉल व्यू का फ्रेम एक अलग आकार है, और अंत परिणाम यह है कि छवि आईफोन पर बहुत दूर ज़ूम हो गई है और आईओएस 8 पर चलते समय आईपैड पर ज़ूम आउट हो गई है। ऐसा इसलिए है क्योंकि स्क्रॉल व्यू फ्रेम की चौड़ाई 600pt है, जो स्टोरीबोर्ड में इसका आकार है (आकार वर्गों का उपयोग कर यूनिवर्सल स्टोरीबोर्ड)। लेकिन मेरे पास ऑटोलायआउट बाधाएं हैं जो सुनिश्चित करने के लिए उपलब्ध हैं कि स्क्रॉल व्यू उपलब्ध स्थान को भरने के लिए फैला हुआ है - यह आईपैड पर 768pt होना चाहिए। यही कारण है कि iOS 7 पर मामला लेकिन है नहीं आईओएस 8.UIScrollView फ्रेम आईओएस 8 बनाम आईओएस 7

इस सेटअप है: इंटरफ़ेस निर्माता में, मैं एक UIViewController कि एक UIView जो autolayout contraints के साथ एक UIScrollView, अनुगामी प्रमुख होता है, नीचे शामिल है, और करने के लिए शीर्ष अंतरिक्ष पर्यवेक्षक। तब viewDidLoad में:

UIImage *image = [UIImage imageNamed:@"image"]; 
    self.imageView = [[UIImageView alloc] initWithImage:image]; 
    self.imageView.contentMode = UIViewContentModeScaleAspectFit; 
    self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height); 

    [self.scrollView addSubview:self.imageView]; 
    self.scrollView.contentSize = image.size; 

    #warning Bug here - scroll view frame is 600pt on iOS 8 - should be 768 for iPad 
    NSLog(@"scroll view frame wid: %f", self.scrollView.frame.size.width); 

मैं अगर मैं डाल कि एक ही viewDidAppear में NSLog फ्रेम की चौड़ाई सही ढंग से 768pt है की खोज की। मैंने viewDidLoad के बजाय उस कोड को viewWillAppear में स्थानांतरित करने का प्रयास किया, लेकिन मुझे एक ही परिणाम मिल गया - यह 600 में viewWillAppear है। इसलिए स्क्रॉल व्यू डिस्प्ले भरने के लिए ठीक से खींच रहा है लेकिन स्क्रीन पर दिखाई देने तक नहीं। स्क्रीन पर छवि प्रकट होने से पहले मुझे सही फ्रेम आकार की आवश्यकता है ताकि मैं उचित न्यूनतम और अधिकतम ज़ूम मानों की गणना कर सकूं।

मैं इसे ठीक करने के लिए क्या कर सकता हूं और यह सुनिश्चित करता हूं कि यह आईओएस 7 और 8 के लिए काम करता है?

+0

फोन जब आप कहते हैं कि "600pt, जो स्टोरीबोर्ड में इसका आकार है", तो आप एक निरंतर आकार बाधा की बात कर रहे हैं, या एक अस्थायी "प्लेसहोल्डर" आंतरिक आकार मूल्य? –

+0

@IanMacDonald एक सार्वभौमिक स्टोरीबोर्ड का उपयोग करते समय दृश्य का डिफ़ॉल्ट आकार 600 है। चूंकि स्क्रॉल व्यू ऑटोलायआउट के माध्यम से चौड़ाई/ऊंचाई को भरने के लिए फैला है, यह डिफ़ॉल्ट रूप से 600 भी है लेकिन इसे पूरे दृश्य के आकार को भरने के लिए खींचना है। – Joey

+0

हां, मैं समझता हूं कि डिफ़ॉल्ट आकार 600 है। मैं उत्सुक था कि आपका स्क्रॉल व्यू उन दो क्षेत्रों में से किसी एक में 600 की रिपोर्ट कर रहा है, या यदि यह गणना की गई फ्रेम फ़ील्ड में है। क्या स्क्रोल व्यू में एक पर्यवेक्षण है जो खींच नहीं रहा है? –

उत्तर

22

मैंने इसे हल कर लिया है। कुछ कारणों से, viewDidLoad आईओएस 8 पर स्क्रॉल व्यू के समायोजित फ्रेम प्राप्त करने के लिए जीवन चक्र में बहुत जल्दी है, लेकिन फिर यह आईओएस 7 पर काम करता है। viewWillAppear भी बहुत जल्दी है, साथ ही viewWillLayoutSubviews भी है।

समस्या को हल करने के लिए, मैंने बस कोड को स्थानांतरित किया जहां मुझे स्क्रॉल व्यू के फ्रेम आकार का उपयोग viewDidLayoutSubviews पर करने की आवश्यकता है, जो अंत में सही आकार प्राप्त होता है जब यह प्रकट होता है।

+3

यदि आप किसी भी विज़ुअल जिटर से बचना चाहते हैं, तो आप हमेशा अपना स्क्रॉलव्यू छुपा सकते हैं जब तक कि आप इसे 'viewDidLayoutSubviews' में फ्रेम न करें। –

+0

यह वास्तव में आईओएस 7 पर स्क्रॉलव्यू का आकार बदलने में मदद करता है - धन्यवाद – moonvader

+0

भारी धन्यवाद।मैंने कुछ घंटों बिताए कि यह पता लगाने की कोशिश कर रहा है कि क्यों स्क्रॉल व्यू में पहली छवि बाकी की तुलना में अलग-अलग आकार में थी (क्योंकि वे समय के बाद के समय में आकार लेते हैं)। – Hobsie

1

मैं भी इसी तरह की समस्या के साथ बहुत संघर्ष कर रहा था। मैंने इसे द्वारा हल किया है सामग्री की चौड़ाई बदलना स्क्रॉलव्यू प्रोग्राम के अंदर देखें। ViewDidLoad में मैं इस विधि

func setupWidthOfContentView(){ 

    let screen = UIScreen.mainScreen().bounds 
//  println("Width: \(screen.size.width) Height: \(screen.size.height)") 

    var constW = NSLayoutConstraint(item: vwContentView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: screen.size.width) 
    vwContentView.addConstraint(constW) 
} 
संबंधित मुद्दे