मैं UIScrollView को शीर्ष पर कैसे स्क्रॉल करूं?
मैं UIScrollView को शीर्ष पर कैसे स्क्रॉल करूं?
जवाबों:
[self.scrollView setContentOffset:
CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];
[self.scrollView setContentOffset:CGPointZero animated:YES];
या यदि आप क्षैतिज स्क्रॉल स्थिति को संरक्षित करना चाहते हैं और केवल ऊर्ध्वाधर स्थिति को रीसेट करते हैं:
[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0)
animated:YES];
[scrollView setContentOffset:CGPointMake(0, -scrollView.contentInset.top) animated:YES];
यह iOS 6 & 7 में काम करता है
[scrollView setContentOffset:CGPointMake(0, scrollView.contentSize.height-scrollView.frame.size.height) animated:YES];
यहां एक स्विफ्ट एक्सटेंशन है जो इसे आसान बनाता है:
extension UIScrollView {
func scrollToTop() {
let desiredOffset = CGPoint(x: 0, y: -contentInset.top)
setContentOffset(desiredOffset, animated: true)
}
}
उपयोग:
myScrollView.scrollToTop()
नए के साथ काम करने की कोशिश करें adjustedContentInset
।
उदाहरण के लिए (शीर्ष पर स्क्रॉल करें):
var offset = CGPoint(
x: -scrollView.contentInset.left,
y: -scrollView.contentInset.top)
if #available(iOS 11.0, *) {
offset = CGPoint(
x: -scrollView.adjustedContentInset.left,
y: -scrollView.adjustedContentInset.top)
}
scrollView.setContentOffset(offset, animated: true)
भले ही आप उपयोग करें
prefersLargeTitles
,safe area
आदि।
स्विफ्ट 4 के लिए
scrollView.setContentOffset(.zero, animated: true)
उपयोग setContentOffset:animated:
[scrollView setContentOffset:CGPointZero animated:YES];
IOS7 में मुझे शीर्ष पर जाने के लिए एक विशेष स्क्रॉलव्यू प्राप्त करने में परेशानी हुई, जिसने iOS6 में काम किया, और शीर्ष पर जाने के लिए स्क्रॉलव्यू को सेट करने के लिए इसका उपयोग किया।
[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
लूट के जवाब के स्विफ्ट 3.0.1 संस्करण :
self.scrollView.setContentOffset(
CGPoint(x: 0,y: -self.scrollView.contentInset.top),
animated: true)
पूरी तरह से स्थिति बार स्क्रॉलटॉप व्यवहार को दोहराने के लिए हमें न केवल कंटेंटऑफसेट सेट करना होगा बल्कि यह भी सुनिश्चित करना होगा कि स्क्रॉलइंडिकेटर्स प्रदर्शित हों। अन्यथा उपयोगकर्ता जल्दी से खो सकता है।
इसे पूरा करने का एकमात्र सार्वजनिक तरीका है flashScrollIndicators
। दुर्भाग्य से, सामग्री को सेट करने के बाद एक बार कॉल करने से ऑफीस का कोई प्रभाव नहीं पड़ता क्योंकि यह तुरंत रीसेट हो जाता है। मैंने पाया कि जब यह फ़्लैश हर बार काम करता है scrollViewDidScroll:
।
// define arbitrary tag number in a global constants or in the .pch file
#define SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG 19291
- (void)scrollContentToTop {
[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];
self.scrollView.tag = SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.scrollView.tag = 0;
});
}
अपने UIScrollViewDelegate (या UITable / UICollectionViewDelegate) में इसे लागू करें:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.tag == SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG) {
[scrollView flashScrollIndicators];
}
}
स्टेटस बार स्क्रॉलटॉप व्यवहार की तुलना में छिपाने की देरी थोड़ी कम है लेकिन यह अभी भी अच्छा लग रहा है।
ध्यान दें कि मैं "ScrollingToTop "स्थिति को संप्रेषित करने के लिए व्यू टैग का दुरुपयोग कर रहा हूं क्योंकि मुझे व्यू कंट्रोलर्स में इसकी आवश्यकता है। यदि आप कुछ और के लिए टैग का उपयोग कर रहे हैं, तो आप इसे iVar या संपत्ति के साथ बदलना चाह सकते हैं।
मुझे लगता है कि मेरे पास एक उत्तर है जो आईओएस 11 के साथ-साथ पूर्व संस्करणों (ऊर्ध्वाधर स्क्रॉलिंग के लिए) पूरी तरह से संगत होना चाहिए
इस खाते में नए लेता adjustedContentInset और यह भी के लिए खातों अतिरिक्त आवश्यक जब ऑफसेट prefersLargeTitles navigationBar जो जो कुछ भी की डिफ़ॉल्ट है एक अतिरिक्त 52px शीर्ष पर ऑफसेट की आवश्यकता प्रतीत होता है पर सक्षम है
यह थोड़ा मुश्किल था क्योंकि एडिट स्टेट स्टेट (बड़े टाइटल बनाम छोटे टाइटल) के आधार पर एडजस्टेबल कांटेस्ट में बदलाव होता है, इसलिए मुझे यह देखने और देखने की जरूरत थी कि टाइटलर की ऊंचाई क्या है और बड़े राज्य में इसकी पहले से ही 52px ऑफसेट को लागू न करें। नेवीगेशन की स्थिति की जांच करने के लिए कोई अन्य तरीका नहीं खोज सका, अगर किसी के पास यह देखने से बेहतर विकल्प है कि क्या ऊंचाई है> 44.0 तो मैं इसे सुनना चाहता हूं
func scrollToTop(_ scrollView: UIScrollView, animated: Bool = true) {
if #available(iOS 11.0, *) {
let expandedBar = (navigationController?.navigationBar.frame.height ?? 64.0 > 44.0)
let largeTitles = (navigationController?.navigationBar.prefersLargeTitles) ?? false
let offset: CGFloat = (largeTitles && !expandedBar) ? 52: 0
scrollView.setContentOffset(CGPoint(x: 0, y: -(scrollView.adjustedContentInset.top + offset)), animated: animated)
} else {
scrollView.setContentOffset(CGPoint(x: 0, y: -scrollView.contentInset.top), animated: animated)
}
}
जकूब के समाधान से प्रेरित
जब आपका नेविगेशन बार स्क्रॉल दृश्य सामग्री के छोटे हिस्से को ओवरलैप करता है तो यह बहुत सामान्य है और ऐसा लगता है कि सामग्री शीर्ष से शुरू नहीं होती है। इसे ठीक करने के लिए मैंने 2 काम किए:
पत्रिका के लिए शीर्ष पर UITableViewController
, UICollectionViewController
या किसी UIViewController
के होनेUIScrollView
extension UIViewController {
func scrollToTop(animated: Bool) {
if let tv = self as? UITableViewController {
tv.tableView.setContentOffset(CGPoint.zero, animated: animated)
} else if let cv = self as? UICollectionViewController{
cv.collectionView?.setContentOffset(CGPoint.zero, animated: animated)
} else {
for v in view.subviews {
if let sv = v as? UIScrollView {
sv.setContentOffset(CGPoint.zero, animated: animated)
}
}
}
}
}
स्विफ्ट 5 में सामग्री को शून्य पर सेट करें
scrollView.setContentOffset(CGPoint.zero, animated: true)
मैंने सभी तरह से कोशिश की। लेकिन मेरे लिए कुछ भी काम नहीं किया। अंत में मुझे यह पसंद आया।
मैंने self.view .addSubview(self.scroll)
viewDidLoad में कोड की लाइन जोड़ी । स्क्रॉल दृश्य के लिए फ्रेम सेट करना शुरू करने और दृश्य स्क्रॉल करने के लिए घटकों को जोड़ा।
इसने मेरे लिए काम किया।
सुनिश्चित करें कि आपने self.view .addSubview(self.scroll)
शुरुआत में लाइन जोड़ी थी। तब आप UI तत्व जोड़ सकते हैं।
UIScrollView
contentInset
दुर्भाग्य से ध्यान में रखना होगा ।[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];
मेरे लिए काम करता है