मैं एक विवरण दृश्य नियंत्रक के राज्य का समायोजन कर रहा हूँ, बस से पहले ही एक 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
को रोकने के लिए कोई तरीका है?
आप एनीमेशन ब्लॉक के भीतर सामग्री ऑफसेट को समायोजित क्यों कर रहे हैं? CATransaction सामान छोड़ें, तो यह एनिमेट नहीं करता है। तो यह चंचल नहीं लगेगा। – Andrew
कैट्रानैक्शन सामान को हटाने से वास्तव में कोई चीज़ नहीं बदली जाती है, इसलिए इसे हटा दिया जाता है। – Berik
क्या आप वाकई ViewDidAppear को कॉल कर रहे हैं? मैं इसमें ब्रेकपॉइंट या एनएसएलओजी स्टेटमेंट सेट करूंगा। साथ ही, क्या आपने अपनी कॉल के ऑर्डर को स्विच करने का प्रयास किया है, यानी विवरण सेट करने के बाद फॉरऑब्जेक्ट को सेट करना? – Andrew