2010-09-05 8 views
6

मैं रोटेशन परिवर्तनों के दौरान UIScrollView के contentOffset मैन्युअल रूप से अपडेट करना चाहता हूं। स्क्रॉल व्यू स्क्रीन भरता है और इसमें लचीली चौड़ाई और लचीली ऊंचाई होती है।सामग्री रोटेशन के दौरान UIScrollView की ऑफसेट

मैं वर्तमान में, willRotateToInterfaceOrientation में contentOffset अद्यतन करने के लिए कोशिश कर रहा हूँ इस तरह:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [Utils logPoint:myScrollView.contentOffset tag:@"initial"]; 
    myScrollView.contentOffset = CGPointMake(modifiedX, modifiedY); 
    [Utils logPoint:myScrollView.contentOffset tag:@"modified"]; 
} 

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    [Utils logPoint:myScrollView.contentOffset tag:@"final"]; 
} 

हालांकि, अंतिम मूल्य नहीं संशोधित मूल्य, और यह थोड़े से प्रभावित किया जा रहा है, लेकिन यह नहीं है मुझे कैसे स्पष्ट है।

initial: (146.000000;-266.000000) 
modified: (81.000000;-108.000000) 
final: (59.000000;-0.000000) 

initial: (146.000000;-266.000000) 
modified: (500.000000;500.000000) 
final: (59.000000;500.000000) 

initial: (146.000000;-266.000000) 
modified: (-500.000000;-500.000000) 
final: (-0.000000;-0.000000) 

मैं कैसे एक रोटेशन बदलने के दौरान एक स्क्रॉल देखने के contentOffset अपडेट करते हैं:

ये परिणाम है कि मैं पाने के कुछ कर रहे हैं?

+1

आप 'बजाय willAnimateRotationToInterfaceOrientation' में contentOffset बदलने का प्रयास किया? तब तक एक एनीमेशन ब्लॉक होना चाहिए, शायद परिणाम अलग है। – Pascal

+0

@ पास्कल हां, और यह ठीक काम करता है। फिर भी मैं जानना चाहता हूं कि अगर मैं इसे WillRotateToInterfaceOrientation में बदलता हूं तो यह अपेक्षित व्यवहार क्यों नहीं करता है। – hpique

+0

मेरा अनुमान यह होगा कि माता-पिता का फ्रेम केवल ** 'willRotateToInterfaceOrientation' के बाद ** बदलता है, इसलिए आप एक अलग सामग्री ऑफ़सेट सेट करते हैं, लेकिन वह तुरंत फिर से बदल जाता है क्योंकि पर्यवेक्षक का फ्रेम भी तब बदलता है। ओएस के लिए ऐसा लगता है कि आप कुछ समय पहले फ्रेम बदल चुके होंगे, लंबित रोटेशन के संबंध में नहीं। – Pascal

उत्तर

12

एक जवाब :)

कोशिश के बजाय से contentOffset बदलते willAnimateRotationToInterfaceOrientation:duration: भीतर करने के लिए मेरी टिप्पणी परिवर्तित। तब तक एक एनीमेशन ब्लॉक होना चाहिए, और ओएस रोटेशन के कारण होने वाले परिवर्तनों से संबंधित सामग्री में आपके परिवर्तनों को ऑफ़सेट करता है।

यदि आप पहले सामग्री को बदलते हैं, तो ऐसा लगता है कि सिस्टम रोटेशन से संबंधित इन परिवर्तनों का सम्मान नहीं करता है, और फिर भी आपके नए आयामों से शुरू होने पर घूर्णन-आकार बदलने पर लागू होता है।

+0

दूसरों की मदद करने के लिए कोड स्निपेट जोड़कर एक आकर्षण की तरह काम किया। – Shardul

+1

इस विधि को बहिष्कृत किया गया है। 'ViewWillTransitionToSize' या 'WillTransitionToTraitCollection' – Gerald

4

यूआईएसक्रॉल व्यू और पेज ऑफसेट पर पेजिंग सक्षम होने पर निम्नलिखित स्निपेट चाल चलती हैं।

एक संपत्ति जो रोटेशन से पहले currentPage की स्थिति की गणना करेगा घोषित, और यह viewDidLoad

@property (assign, nonatomic) NSInteger lastPageBeforeRotate; 

में -1 तब willRotateToInterfaceOrientation:toInterfaceOrientation:duration विधि ओवरराइड और इसे करने के लिए गणना मान असाइन निर्धारित किया है।

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    int pageWidth = self.scrollView.contentSize.width/self.images.count; 
    int scrolledX = self.scrollView.contentOffset.x; 
    self.lastPageBeforeRotate = 0; 

    if (pageWidth > 0) { 
     self.lastPageBeforeRotate = scrolledX/pageWidth; 
    } 

    [self showBackButton:NO]; 
} 

तो हम यह सुनिश्चित करने से पहले रोटेशन किया जाता है, हम सेट है कि हमारे scrollview की सामग्री ठीक से ऑफसेट, इसलिए के रूप में यह iOS के लिए हमारी lastPageBeforeRotate

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
     if (self.lastPageBeforeRotate != -1) { 
      self.scrollView.contentOffset = CGPointMake(self.scrollView.bounds.size.width * self.lastPageBeforeRotate, 0); 
      self.lastPageBeforeRotate = -1; 
     } 
} 
+0

का उपयोग करने का प्रयास करें बहुत बहुत धन्यवाद! यही एकमात्र समाधान है जो वास्तव में मेरे लिए काम करता है :) –

3

अपडेट किया गया जवाब 8

लागू करने ध्यान केंद्रित करने की viewWillTransitionToSize: withTransitionCoordinator: आपके नियंत्रक में।

उदाहरण:

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    NSUInteger visiblePage = (NSInteger) self.scrollView.contentOffset.x/self.scrollView.bounds.size.width; 

    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     self.scrollView.contentOffset = CGPointMake(visiblePage * self.scrollView.bounds.size.width, self.scrollView.contentOffset.y); 
    } completion:nil]; 
} 
+0

धन्यवाद! यह दिलचस्प है कि scrollView.bounds एनिमेटसाइड ट्रांज़िशन फ़ंक्शन एनिमेट के भीतर नए/अलग-अलग मान का उपयोग करता है। –