2012-09-06 14 views
6

के साथ ज़ूम आउट करने पर कूदती है, मैं अपने UIScrollView नमूना के साथ सहायता चाहता हूं।सामग्री UIScrollView

मैंने एक साधारण प्रोग्राम बनाया जो सामग्री को स्क्रॉल और ज़ूम करता है (UIImageView)। यह ठीक काम करता है, सिवाय इसके कि जब मैं ज़ूम आउट करने का प्रयास करता हूं तो सामग्री अक्सर दाएं-तल पर गायब हो जाती है। लेकिन चूंकि मैंने minimumZoomScale से 1.0f सेट किया है, इसलिए यह वास्तव में ज़ूम आउट नहीं कर रहा है, केवल सामग्री दृश्य से बाहर निकल रही है। और और भी अजीब बात यह है कि मैं इसके बाद स्क्रॉल नहीं कर सकता। स्पष्ट रूप से सामग्री का आकार भी गड़बड़ हो गया है।

enter image description here

सेटअप मैं अपने नमूना कोड में नीचे आकृति में के रूप में है।

enter image description here

जब मैं (कोशिश कर) बाहर ज़ूम करने के बाद स्थिति की जाँच की, मैं दो गलत बातें पाया।

  • _scrollView.contentSize 480x360, जो नहीं होना चाहिए से छोटी 1000x1000
  • _scrollView.bounds किसी भी तरह शीर्ष करने के लिए कूद गया है (यानी, _scrollView.bounds.origin.y हमेशा 0 है)

दो आइटम के साथ सामना करने के लिए ऊपर, मैंने अपने UIScrollViewDelegate में निम्न कोड जोड़ा और अब यह ठीक काम करता है।

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view 
{ 
    if(scrollView == _scrollView && view == _contentView) 
    { 
     // Setting ivars for scrollViewDidZoom 
     _contentOffsetBeforeZoom = _scrollView.contentOffset; 
     _scrollViewBoundsBeforeZoom = _scrollView.bounds; 
    } 
} 

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
{ 
    if(scrollView == _scrollView) 
    { 
     // If you zoom out, there are cases where ScrollView content size becomes smaller than original, 
     // even though minimum zoom scale = 1. In that case, it will mess with the contentOffset as well. 
     if(_scrollView.contentSize.width < CONTENT_WIDTH || _scrollView.contentSize.height < CONTENT_HEIGHT) 
     { 
      _scrollView.contentSize = CGSizeMake(CONTENT_WIDTH, CONTENT_HEIGHT); 
      _scrollView.contentOffset = _contentOffsetBeforeZoom; 
     } 

     // If you zoom out, there are cases where ScrollView bounds goes outsize of contentSize rectangle. 
     if(_scrollView.bounds.origin.x + _scrollView.bounds.size.width > _scrollView.contentSize.width || 
      _scrollView.bounds.origin.y + _scrollView.bounds.size.height > _scrollView.contentSize.height) 
     { 
      _scrollView.bounds = _scrollViewBoundsBeforeZoom; 
     }    
    } 
} 

हालांकि, यह इस करने के लिए नीचे आने के लिए की जरूरत है? यह एक बहुत ही सरल अनुक्रम है, और यह विश्वास करना मुश्किल है कि ऐप्पल को इस तरह के प्रयास करने की आवश्यकता है। तो, मेरी शर्त है कि मुझे यहां कुछ याद आ रहा है ...

मेरा मूल कोड निम्नलिखित है। कृपया मुझे यह जानने में सहायता करें कि मैं क्या गलत कर रहा हूं (या कुछ याद आ रहा है)!

#define CONTENT_WIDTH 1000 
#define CONTENT_HEIGHT 1000 

    >>>> Snip >>>> 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; 
    _scrollView.contentSize = CGSizeMake(CONTENT_WIDTH, CONTENT_HEIGHT); 
    _scrollView.backgroundColor = [UIColor blueColor]; 
    _scrollView.maximumZoomScale = 8.0f; 
    _scrollView.minimumZoomScale = 1.0f; 
    _scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; 
    _scrollView.scrollEnabled = YES; 
    _scrollView.delegate = self; 
    [self.view addSubview:_scrollView]; 

    _contentView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sample.jpg"]]; // sample.jpg is 480x360 
    CGPoint center = (CGPoint){_scrollView.contentSize.width/2, _scrollView.contentSize.height/2}; 
    _contentView.center = center; 
    [_scrollView addSubview:_contentView]; 

    _scrollView.contentOffset = (CGPoint) {center.x - _scrollView.bounds.size.width/2, center.y - _scrollView.bounds.size.height/2};   
} 

- (UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    if(scrollView == _scrollView) 
    { 
     return _contentView; 
    } 
    return nil; 
} 
+1

क्या आपने '_contentView को सेट करने का प्रयास किया है।autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; '? – Adam

+0

सुझाव के लिए धन्यवाद। लेकिन नहीं, यह स्थिति में बदलाव नहीं करता है ... – barley

+0

क्या मैं पूछ सकता हूं कि आपकी 'सामग्री आकार' 1000x1000 क्यों है? – tia

उत्तर

10

मैं एक त्वरित नमूना प्रोजेक्ट बनाया और कोड आप चिपकाया का उपयोग कर एक ही मुद्दा आप वर्णित किया था। मुझे बिल्कुल नहीं पता कि आईओएस में ज़ूम करने का "उचित" तरीका क्या है लेकिन मुझे this ट्यूटोरियल मिला जो कहता है कि आपको अपनी सामग्री को हाल ही में देखना होगा स्क्रॉल के बाद देखें ज़ूम किया गया है। मैं व्यक्तिगत रूप से यह स्वचालित रूप से फिर से केंद्रित होने की अपेक्षा करता हूं कि यह विचार है कि आप दृश्य में लौट रहे हैं ForZoomingInScrollView प्रतिनिधि विधि लेकिन स्पष्ट रूप से नहीं।

- (void)centerScrollViewContents { 
    CGSize boundsSize = _scrollView.bounds.size; 
    CGRect contentsFrame = _contentView.frame; 

    if (contentsFrame.size.width < boundsSize.width) { 
     contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width)/2.0f; 
    } else { 
     contentsFrame.origin.x = 0.0f; 
    } 

    if (contentsFrame.size.height < boundsSize.height) { 
     contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height)/2.0f; 
    } else { 
     contentsFrame.origin.y = 0.0f; 
    } 

    _contentView.frame = contentsFrame; 
} 

- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    // The scroll view has zoomed, so we need to re-center the contents 
    [self centerScrollViewContents]; 
} 

ऊपर कोड मेरे द्वारा नहीं लिखा है, लेकिन बस ट्यूटोरियल से नकल कर रहा है। मुझे लगता है कि यह बहुत सरल है। साथ ही, सामग्री दृश्य को केंद्रित करना बहुत अधिक सुरुचिपूर्ण प्रतीत होता है, फिर स्क्रॉलव्यू की सीमाओं और सामग्री आकार को लगातार बदलता है, इसलिए इसे आज़माएं।

+0

उत्तर के लिए धन्यवाद! यह समझ में आता है और यह अच्छी तरह से काम किया। आपके उत्तर में एकमात्र चीज यह थी कि '_scrollView.frame' मेरे संदर्भ में' _contentView.frame' होना चाहिए। मैं उस भाग को संपादित करूंगा और मेरे उत्तर के रूप में चयन करूंगा। – barley

0

यदि किसी को पृष्ठभूमि दिखाने के लिए ज़ूम आउट करते समय बाउंसिंग का कोई समस्या हो रही है, तो इंटरफ़ेस बिल्डर में बाउंस (बाउंस ज़ूम) को निकालने का प्रयास करें।

1

मैं प्रतिनिधि उत्तर का उपयोग करके इस समस्या को ठीक करने में सक्षम था जो ज़ूम के बाद दरों को समायोजित करता था ... लेकिन फिर मुझे याद आया कि मैं ऑटो लेआउट का उपयोग कर रहा था, और केवल क्षैतिज और लंबवत केंद्रित करने के लिए बाधाएं जोड़ रहा था (बाधाओं के अतिरिक्त स्क्रॉल व्यू के प्रत्येक किनारे पर छवि को बांधना) प्रतिनिधि विधियों का उपयोग किए बिना मेरे लिए समस्या हल कर दिया।

+0

प्रश्न फ्रेम और स्ट्रेट युग से था, और यह जानकर खुशी हुई कि बाधाएं अब इस मुद्दे को हल करती हैं! – barley