2011-10-05 13 views
6

के लिए ज़ूम इन करने के बाद सामग्री प्रस्तुत करना मैंने देखा है और ऐसा लगता है कि लोग कहते हैं कि आप अब ज़ूम इन करने के बाद डेटा को फिर से प्रस्तुत कर सकते हैं कि आप UIScrollView के लिए स्केल फैक्टर को जानते हैं। मैंने आपकी परत को CATiledLayer पर बनाने के बारे में कुछ पोस्ट भी देखी हैं और स्तरों को सेट करेंऑफेंटबियास और स्तरऑफडेंट सेट करें।UIScrollView

क्या मैं एक UIScrollView है, और यह, एक ResultsView जो UIView का एक उपवर्ग है:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     CATiledLayer *tiledLayer = (CATiledLayer *)self.layer; 
     tiledLayer.levelsOfDetailBias = 3; 
     tiledLayer.levelsOfDetail = 3; 
     self.opaque = YES; 
    } 
    return self; 
} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
} 
*/ 

+ (Class)layerClass { 
    return [CATiledLayer class]; 
} 

मेरी कक्षा जहाँ मैं UIScrollView और ResultsView है में, मैं कार्य करें:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return self.ResultsView; 
} 

क्या पाठ को पुनः प्रस्तुत करने के लिए पर्याप्त है (तेज)? या मैं यदि हां, तो मैं ऐसा करने के लिए कैसे यकीन नहीं है

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
} 

में कुछ लागू करने की आवश्यकता है। UIScrollView और ResultsView के साथ मेरी कक्षा में, परिणाम दृश्य (XIB में) में, मेरे पास केवल कुछ UILabels और UIViews हैं (UIViews दृश्य के लिए शीर्षक/पाद लेख के लिए उपयोग किए जाते हैं)। इसलिए मुझे नहीं पता कि परिणामव्यू से उनको कैसे निकाला जाए। हालांकि परिणाम दृश्य में XIB में इसके बच्चे के रूप में UILabels और UIViews हैं, मुझे यकीन नहीं है कि मैं परिणामव्यू कक्षा से उनको कैसे हटा दूंगा, और मुझे वैसे भी करने की आवश्यकता होगी।

या यह गलत दृष्टिकोण है? क्या मुझे केवल UILabel और UIView को स्केल कारक द्वारा स्केल फैक्टर द्वारा आकार बदलने की आवश्यकता है: प्रतिनिधि विधि? टीआईए

उत्तर

18

मुझे लगता है कि आप गलत दृष्टिकोण ले रहे हैं। यदि आपके दृश्य में UILabels और UIViews शामिल हैं जो कोई कस्टम ड्राइंग नहीं करते हैं, तो मैं CATiledLayer समर्थित दृश्य का उपयोग करने में गड़बड़ नहीं करता। withView: atScale: इसके बजाय scrollViewDidEndZooming लागू प्रतिनिधि विधि और कुछ इस तरह करते हैं:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    scale *= [[[self.scrollView window] screen] scale]; 
    [view setContentScaleFactor:scale]; 
    for (UIView *subview in view.subviews) { 
     [subview setContentScaleFactor:scale]; 
    } 
} 
+0

धन्यवाद। यह वास्तव में अच्छी तरह से काम किया। मुझे नहीं लगता कि मुझे इस तरह का जवाब मिल गया होगा। क्या आप समझा सकते हैं कि आपको पहले लाइन स्केल * = की आवश्यकता क्यों है ... क्या डिवाइस के लिए खिड़की/स्क्रीन/स्केल रिटर्न अलग-अलग होगा? धन्यवाद। –

+0

हां, यह रेटिना डिस्प्ले को संगत बनाता है। आईपैड और गैर-रेटिना डिस्प्ले आईफ़ोन/आईपॉड स्पर्श पर, विंडो स्क्रीन स्केल 1.0 है इसलिए इसका कोई प्रभाव नहीं पड़ता है। रेटिना डिस्प्ले पर यह 2.0 है इसलिए यह उन डिस्प्ले के लिए पैमाने को सही तरीके से समायोजित करता है। – afarnham

+0

एक दृश्य क्लीनर दृष्टिकोण यह देखने के लिए हो सकता है कि आप UIView के उप-वर्ग को ज़ूम कर रहे हैं (यदि यह पहले से नहीं है) और एक विधि बनाएं जो प्रत्येक सबव्यू को अपनी सामग्री को अपडेट करने के लिए बताती है। सभी सबव्यूव्स के माध्यम से सीधे लूपिंग के बजाय स्केलफ़ैक्टर। यदि आपके पास कुछ चित्र हैं जो कस्टम ड्राइंग करते हैं तो यह आपको अधिक बढ़िया अनाज नियंत्रण देगा क्योंकि आप सेटNeedsDisplay को भी कॉल करना चाहते हैं। – afarnham

4

मैं में स्वीकार कर लिया समाधान है कि मुझे दर्द के कुछ ही मिनटों के कारण होता है सिर्फ मामले में किसी और को जोड़ने के लिए कुछ छोटे चलाता है वही चीज।

दृश्य में सभी सबव्यूज़ के माध्यम से लूपिंग आप ज़ूम कर रहे हैं और सेट को कॉल कर रहे हैं CONTContentScaleFactor किसी भी सबव्यूव में स्वयं के सबव्यूज़ होने पर ध्यान में नहीं आता है। आप ऐसा एक और अधिक जटिल सेटअप है, तो उन कंटेनर विचारों का subviews के माध्यम से भी करने के लिए लूप सुनिश्चित करें और फोन

[subview setContentScaleFactor:scale]; 
प्रत्येक पर

। मैंने एक विधि बनाई है जिसे मैं किसी दिए गए दृश्य के सभी सबव्यूज़ पर setContentScaleFactor को कॉल करने के लिए आमंत्रित कर सकता हूं और स्क्रीन पर प्रत्येक "कंटेनर व्यू" के लिए कॉल कर सकता हूं।

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 
{ 
    scale *= [[[self.scrollView window] screen] scale]; 
    [view setContentScaleFactor:scale]; 
    for (UIView *subview in view.subviews) 
    { 
     [self setContentSizeForView:subview andScore:scale]; 

     //Loop through all the subviews inside the subview 
     for(UIView *subSubview in subview.subviews) 
     { 
      [self setContentSizeForView:subSubview andScale:scale]; 
     } 
    } 
} 

- (void) setContentSizeForView:(UIView*) view andScale:(float)scale 
{ 
    [view setContentScaleFactor:scale]; 
} 
+0

क्या मुझे कोई अन्य कॉल करना है?जब मैं सामग्री को सेट करता हूं तो मेरे UIView सबक्लास (दृश्य को ड्राइंग के लिए और ज़ूम करने के लिए उपयोग किया जाता है) स्केल के मान (UIScrollView प्रतिनिधि विधि के) के बराबर होता है, मेरा ऐप वास्तव में धीमा और क्रैश हो जाता है। – Sebastian

+0

हां, मैंने यह भी देखा कि बहुत सारे सबव्यूव होने पर यह बहुत धीमी गति से चल रहा है। मैंने अंततः एक जटिल दृश्य/सबव्यू पदानुक्रम के लिए ज़ूम करते समय सामग्री को तेज करने पर छोड़ दिया क्योंकि यह बहुत धीमी थी। – DiscDev

+0

आप जिस विधि को बनाते हैं उसमें पेस्ट क्यों नहीं करते? –