2011-06-29 14 views
34

मैं एक विवरण दृश्य नियंत्रक के राज्य का समायोजन कर रहा हूँ, बस से पहले ही एक navigationController पर धकेल दिया जाता है:UIScrollView समायोजित कर देता है contentOffset जब contentSize बदलता है

[self.detailViewController detailsForObject:someObject]; 
[self.navigationController pushViewController:self.detailViewController 
            animated:YES]; 

DetailViewController एक scrollview वास। किन सामग्री मैं पारित कर दिया वस्तु के आधार पर आकार में बदलें:

- (void)detailsForObject:(id)someObject { 
    // set some textView's content here 
    self.contentView.frame = <rect with new calculated size>; 

    self.scrollView.contentSize = self.contentView.frame.size; 
    self.scrollView.contentOffset = CGPointZero; 
} 

अब, यह सब काम करता है, लेकिन scrollview समायोजित कर देता है यह navigationController की एनीमेशन स्लाइड-इन के दौरान contentOffset है। contentOffset अंतिम सामग्री आकार और नई गणना के बीच के अंतर के लिए सेट किया जाएगा। इसका मतलब यह है कि दूसरी बार जब आप विवरण खोलते हैं, तो विवरण कुछ अवांछित स्थान पर स्क्रॉल करेंगे। भले ही मैं contentOffset को CGPointZero पर स्पष्ट रूप से सेट कर रहा हूं।

मैंने पाया कि - viewWillAppear में contentOffset को रीसेट करने का कोई प्रभाव नहीं पड़ता है। सबसे अच्छा मैं के साथ, viewDidAppear में contentOffset को रीसेट है सामग्री की एक ध्यान देने योग्य ऊपर और नीचे आंदोलन के कारण आ सकता है:

- (void)viewDidAppear:(BOOL)animated { 
    self.scrollView.contentOffset = CGPointZero; 
} 

वहाँ का समायोजन अपने contentOffset जब इसकी contentSize बदल गया है से एक UIScrollView को रोकने के लिए कोई तरीका है?

+0

आप एनीमेशन ब्लॉक के भीतर सामग्री ऑफसेट को समायोजित क्यों कर रहे हैं? CATransaction सामान छोड़ें, तो यह एनिमेट नहीं करता है। तो यह चंचल नहीं लगेगा। – Andrew

+0

कैट्रानैक्शन सामान को हटाने से वास्तव में कोई चीज़ नहीं बदली जाती है, इसलिए इसे हटा दिया जाता है। – Berik

+0

क्या आप वाकई ViewDidAppear को कॉल कर रहे हैं? मैं इसमें ब्रेकपॉइंट या एनएसएलओजी स्टेटमेंट सेट करूंगा। साथ ही, क्या आपने अपनी कॉल के ऑर्डर को स्विच करने का प्रयास किया है, यानी विवरण सेट करने के बाद फॉरऑब्जेक्ट को सेट करना? – Andrew

उत्तर

57

तब होता है जब एक UIViewController युक्त एक UIScrollView धक्का एक UINavigationController का उपयोग कर।

आईओएस 7

समाधान 1 (कोड)

NO करने के लिए @property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets सेट करें।

समाधान 2 (स्टोरीबोर्ड)

सही का निशान हटाएँ Adjust Scroll View Insets

Adjust Scroll View Insets

आईओएस 6

समाधान (कोड)

UIScrollView की संपत्ति contentOffset और contentInsetviewWillLayoutSubviews पर सेट करें। नमूना कोड:

- (void)viewWillLayoutSubviews{ 
    [super viewWillLayoutSubviews]; 
    self.scrollView.contentOffset = CGPointZero; 
    self.scrollView.contentInset = UIEdgeInsetsZero; 
} 
+1

यह समस्या को हल करने का एक नया तरीका है। सामग्री आकार को रीसेट करने के बाद यह अधिक साफ है। – Berik

+3

उत्कृष्ट उत्तर। आईओएस 7 में मतभेदों को पोस्ट करने के लिए धन्यवाद और यहां तक ​​कि चित्रों को स्पष्ट करने के लिए भी शामिल है। सुपर! – Marchy

+4

धन्यवाद !!! पिछले कुछ घंटों के लिए इस पर पागल हो रहे हैं – user2527666

0

क्या आपका स्क्रॉल DetailViewController का मूल दृश्य देखें? यदि हां, scrollview को सादे UIView में लपेटने का प्रयास करें और बाद वाले को DetailViewController का मूल दृश्य बनाएं। चूंकि UIView के पास contentOffset संपत्ति नहीं है, इसलिए वे नेविगेशन नियंत्रक द्वारा बनाई गई सामग्री ऑफसेट समायोजन (नेविगेशन बार आदि के कारण) से प्रतिरक्षा हैं।

+1

scrollView DetailViewController का मूल दृश्य नहीं है। self.scrollView एक UIScrollView से जुड़ा हुआ है जो DetailViewController के मूल दृश्य में रहता है। – Berik

14

इस समस्या का कारण अस्पष्ट है, हालांकि मुझे एक समाधान मिला है। सामग्री का आकार और उन्हें समायोजित करने से पहले ऑफसेट रीसेट करके, UIScrollView चेतन नहीं होगा:

- (void)detailsForObject:(id)someObject { 
    // These 2 lines solve the issue: 
    self.scrollView.contentSize = CGSizeZero; 
    self.scrollView.contentOffset = CGPointZero; 

    // set some textView's content here 
    self.contentView.frame = <rect with new calculated size>; 

    self.scrollView.contentSize = self.contentView.frame.size; 
    self.scrollView.contentOffset = CGPointZero; 
} 
0

मैं समस्या का सामना करना है, और एक विशेष मामले के लिए - मैं आकार को समायोजित नहीं है - मैं प्रयोग किया जाता है:

float position = 100.0;//for example 

SmallScroll.center = CGPointMake(position + SmallScroll.frame.size.width/2.0, SmallScroll.center.y); 

एक ही y के साथ काम करेगा: anotherPosition + SmallScroll.frame.size.height/2.0

तो अगर आप आकार बदलने के लिए की जरूरत नहीं है, यह एक त्वरित और पीड़ारहित समाधान है।

2

मुझे यूआईएसक्रोलव्यू के साथ एक ही समस्या थी, जहां समस्या सामग्री आकार को सेट न करने के कारण हुई थी। सामग्री को सेट करने के बाद आइटम की संख्या को आकार दें इस समस्या को हल किया गया था।

self.headerScrollView.mainScrollview.contentSize = CGSizeMake(320 * self.sortedMaterial.count, 0); 
संबंधित मुद्दे