2009-05-17 5 views
13

नोट: मैंने नीचे दिए गए अपडेट उत्तर में अपना नया समाधान जोड़ा।यूआईएसक्रॉल व्यू की सामग्री में फीका/आउट मोबाइल सफारी जैसे टैब

मैं आईफ़ोन/आईपॉड स्पर्श पर मोबाइल सफारी के टैब में किए गए प्रभावों को फिर से बनाने का प्रयास करता हूं।

असल में, यह एक UIScrollView है जिसमें 4 पुन: प्रयोज्य UIView (रिंग बफर की तरह अभिनय) है, और क्षैतिज स्क्रॉल करता है। स्क्रॉल करते समय, UIView की अस्पष्टता ऑफ़सेट के साथ निर्बाध रूप से फीका होगा।

वर्तमान में, मैं - (void)scrollViewDidScroll:(UIScrollView *)scrollView में सभी गंदी नौकरी करता हूं। जैसे UIScrollView से सामग्री ऑफ़सेट प्राप्त करना, पेजिंगेशन निर्धारित करना, सामग्री ऑफसेट और प्रत्येक UIView स्थितियों के बीच डेल्टा की गणना करना, और उस समय प्रत्येक UIView के अल्फा मान को निर्धारित/सेट करें जब scrollViewDidScroll: कहा जाता था।

और यह काम करता है, प्रदर्शन ठीक है, सब कुछ सुचारू रूप से चलता है, लेकिन एकमात्र समस्या बहुत अधिक गणना कर रही है।

मैंने कोशिश की UIView के beginAnimations: और commitAnimations:, लेकिन यह scrollViewDidScroll: में बेकार है, 1 के बाद से) नई अल्फा मूल्य अभी भी अपने आप से गणना किया जाना है, और 2) scrollViewDidScroll: जब स्क्रॉल बुलाया रखा है तो उसे यहां एनीमेशन करने के लिए व्यर्थ है। कोर एनीमेशन के साथ इस भाग को फिर से लिखने का कोई तरीका है? तो मुझे प्रत्येक UIView के अल्फा मान पर गणित करने की ज़रूरत नहीं है, इसके बजाय, मैं कोर एनीमेशन में पूरे काम छोड़ सकता हूं।

उत्तर

26

अद्यतन

मैं एक और तरीका है के साथ आया था प्रत्येक पृष्ठ के अल्फा मान को अद्यतन करने के लिए। जब सामग्री दृश्य बनाने, मैं UIScrollView के contentOffset साथ addObserver को KVO का उपयोग करें:

[self.scrollView addObserver:[self.contentViews objectAtIndex:i] 
        forKeyPath:@"contentOffset" 
        options:NSKeyValueObservingOptionNew 
        context:@selector(updateAlpha:)]; 

तो यह है कि मेरे contentViews से प्रत्येक संदेश contentOffset बदल मिल जाएगा:

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context { 
    [self performSelector:(SEL)context withObject:change]; 
} 

और मेरे contentViews गणना कर सकते हैं और खुद से चेतन जब स्क्रॉल:

- (void)updateAlpha:(NSDictionary *)change { 
    CGFloat offset = [[change objectForKey:NSKeyValueChangeNewKey] CGPointValue].x; 
    CGFloat origin = [self frame].origin.x; 
    CGFloat delta = fabs(origin - offset); 

    [UIView beginAnimations:@"Fading" context:nil]; 
    if (delta < [self frame].size.width) { 
     self.alpha = 1 - delta/self.frame.size.width*0.7; 
    } else { 
     self.alpha = 0.3; 
    } 
    [UIView commitAnimations]; 
} 
बेशक

, आप पर्यवेक्षक दूर करने के लिए जब आप superview से सामग्री देखने को हटाने की आवश्यकता होगी, और जब नई सामग्री दृश्य बनाया गया तो उन्हें फिर से जोड़ें।

उन लोगों को यह सहायता आशा है जो ऐसा करना चाहते हैं।

+1

बस इसे अभी ढूंढें, और यह बहुत ही बढ़िया है - साझा करने के लिए धन्यवाद! एक गड़बड़: प्रारंभिक अल्फा एकमात्र ऑफस्क्रीन दृश्य के लिए सेट नहीं है। मुझे लगता है कि मैं अद्यतन एल्फा को कॉल कर सकता हूं: जाहिर है, लेकिन शायद शुरुआत में सामग्री सेट अप करने के लिए पर्याप्त है। विचार? –

2

जैसा कि आपने देखा होगा कि कितनी बार scrollViewDidScroll: कहा जाता है, UIScrollView केवल कोर एनीमेशन संक्रमण को आग और भूल नहीं जाता है: यह मैन्युअल रूप से स्पर्श, त्वरण इत्यादि के अनुसार सीमाओं को स्थानांतरित करता है। बदलने के लिए कोई सीधा तरीका नहीं है इस।

हालांकि, अगर आप स्क्रॉल ईवेंट से लादा जा रहा हो, तो आप एक चाल निम्नलिखित की तरह कोशिश कर सकते हैं:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970]; 
    if (timestamp - _savedTimestamp) < 0.1) 
     return; 
    _savedTimestamp = timestamp; 

    // do the rest of your work here 
} 

एच

+0

hatfinch, विचार के लिए धन्यवाद। हालांकि यह सही नहीं है, फिर भी कुछ सीपीयू शक्ति बचाओ। – digdog