2012-06-30 22 views
14

तो यूआईटीबल व्यू में जब आपके पास अनुभाग होते हैं तो अनुभाग दृश्य शीर्ष पर चिपक जाता है जब तक कि अगला अनुभाग इसे ओवरलैप नहीं करता है और फिर इसे शीर्ष पर बदल देता है। मैं एक समान प्रभाव रखना चाहता हूं, जहां मूल रूप से मेरे UIScrollView में UIView है, जो UIView अनुभागों का प्रतिनिधित्व करता है और जब यह शीर्ष पर जाता है .. मैं चाहता हूं कि यह वहां रहे और न जाएं। मैं यह कैसे करु? मैं इस या तो layoutSubviews या scrollViewDidScroll में किया और UIView पर एक हेरफेर कर किए जाने की आवश्यकता लगता है ..UIScrollView में UIView को शीर्ष पर ले जाएं जब

उत्तर

2

अगर मैं सही ढंग से याद है, 2010 WWDC ScrollView प्रस्तुति ठीक चर्चा की दृष्टि रखने के लिए एक स्थिर स्थिति में जबकि अन्य तत्वों के चारों ओर स्क्रॉल । वीडियो देखें और आपके पास लागू करने के लिए एक स्पष्ट कट दृष्टिकोण होना चाहिए।

यह आवश्यक रूप से scrollViewDidScroll कॉलबैक के आधार पर फ़्रेम अपडेट कर रहा है (हालांकि स्मृति बेहतर बिंदुओं पर थोड़ा आलसी है)।

+0

हम्म .. मूल रूप से आपको यह जांचना होगा कि क्या विभाजित UIView शीर्ष पर है और फिर इसे सही रखें? मेरा मुद्दा यह निर्धारित करना है कि यह निर्धारित करने के लिए कि क्या अनुभागित UIView "शीर्ष" – xonegirlz

+0

पर है, यह निर्धारित करने के लिए कि कौन सा दृश्य शीर्ष पर है, आप पर्यवेक्षण से इसके सबव्यूज़ के सरणी के लिए पूछ सकते हैं, उदा। एनएसएआरएआरई * सबव्यूज = [पर्यवेक्षण सबव्यू]। फिर, उन सबव्यूज़ के इंडेक्स के लिए अपनी सरणी से पूछें जिन्हें आप तुलना करना चाहते हैं, उदाहरण के लिए, NSUInteger oneIndex = [सबव्यूज इंडेक्सऑफ ऑब्जेक्ट: व्यूऑन], दो इंडेक्स = [सबव्यूज इंडेक्सऑफ ऑब्जेक्ट: व्यू ट्वू]। एक बार जब आप दोनों सबव्यूज़ के लिए इंडेक्स जाते हैं, तो मूल्यांकन करें कि यह निर्धारित करने के लिए कि कौन सा है, दूसरे के शीर्ष पर है। – isaac

+0

जब मैं शीर्ष पर कहता हूं, इसका मतलब एक दूसरे के शीर्ष पर नहीं है .. लेकिन मेरा मतलब है कि सामग्री पर कौन है। ऑफसेट.ए – xonegirlz

19

UIScrollView में UIView बनाने के लिए जब तक स्क्रॉल करना शीर्ष पर कायम:

- (void)createHeaderView:(UIView*)headerView { 
    _headerView = [headerView retain]; 
    _headerViewInitialY = _headerView.frame.origin.y; 
    [_scrollView addSubview:_headerView]; 
    _scrollView.delegate = self; 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGRect headerFrame = _headerView.frame; 
    headerFrame.origin.y = MAX(_headerViewInitialY, scrollView.contentOffset.y); 
    _headerView.frame = headerFrame; 
} 
+1

वास्तव में अच्छा लग रहा है – svmrajesh

+2

सुनिश्चित करें कि जिस दृश्य के लिए आप स्क्रॉल को पकड़ने का इरादा रखते हैं उसके पास एक प्रतिनिधि सेट है, और वह प्रतिनिधि है जहां scrollViewDidScroll लाइव होगा। यदि आप अपने नियंत्रक को प्रोटोकॉल को कार्यान्वित करने देते हैं, तो आप प्रतिनिधि को [इस] (http://stackoverflow.com/a/14096093) –

+0

पर नियंत्रक में 'स्वयं' के रूप में असाइन कर सकते हैं मैंने कोशिश की और यह ठीक काम करता है लेकिन मेरा विचार पारदर्शी हो गया है और मैंने सबकुछ करने की कोशिश की लेकिन सफल नहीं हुआ, इसलिए कृपया आप मेरी मदद कर सकते हैं या कारण क्यों हो रहा है। यह केवल तब तक पारदर्शी हो जाता है जब तक यह शीर्ष पर चिपक जाता है – Soniya

9

स्विफ्ट समाधान EVYA की प्रतिक्रिया के आधार पर:

var navigationBarOriginalOffset : CGFloat? 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    navigationBarOriginalOffset = navigationBar.frame.origin.y 
} 

func scrollViewDidScroll(scrollView: UIScrollView) { 
    navigationBar.frame.origin.y = max(navigationBarOriginalOffset!, scrollView.contentOffset.y) 
} 
2

Evya के समाधान वास्तव में अच्छी तरह से काम करता है, फिर भी आप का उपयोग करता है, तो ऑटो लेआउट, आपको ऐसा कुछ करना चाहिए (ऑटो लेआउट सिंटैक्स Masonry में लिखा गया है, लेकिन आपको विचार मिलता है।):

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 

    //Make the header view sticky to the top. 
    [self.headerView mas_remakeConstraints:^(MASConstraintMaker *make) { 
     make.top.equalTo(self.scrollView.mas_top).with.offset(scrollView.contentOffset.y); 
     make.left.equalTo(self.scrollView.mas_left); 
     make.right.equalTo(self.scrollView.mas_right); 

     make.height.equalTo(@(headerViewHeight)); 
    }]; 

    [self.scrollView bringSubviewToFront:self.headerView]; 
} 
+2

दुर्भाग्य से यह आपको स्क्रॉल आंदोलन के प्रत्येक फ्रेम के साथ लेआउट बाधाओं को फिर से बनाने के लिए मजबूर करता है। इसके बजाय, आपको क्या करना चाहिए जिसमें कंटेनर में 'UIScrollView' है और हेडर का शीर्ष * कंटेनर * शीर्ष के बराबर है, स्क्रॉलव्यू के शीर्ष प्लस सामग्री ऑफ़सेट नहीं। ऐसा करने से आप एक बार बाधाओं को स्थापित कर सकते हैं। –

+0

mas_updateConstraints – Jaro

संबंधित मुद्दे