2014-09-16 10 views
9

आईओएस 8 में कोई समस्या या सुविधा है। जब MPVolumeView दिखाया गया है, तो यह एनिमेटेड हो रहा है, जैसे 0 से इसकी चौड़ाई तक विस्तार करना। मैं उस व्यवहार को कैसे ठीक कर सकता हूं? आईओएस 7 पर ऐसी कोई समस्या नहीं थी।आईओएस पर MPVolumeView एनीमेशन 8

+0

हाँ, यह निश्चित रूप से एक बग की तरह दिखता है। यह केवल पहली बार होता है MPVolumeView उदाहरण पर्यवेक्षण में जोड़ा जाता है। यदि आप इसे हटा देते हैं और इसे फिर से जोड़ते हैं, तो यह केवल अपेक्षित दिखाई देगा। –

+0

मैंने इस मुद्दे के लिए कुछ दिन पहले एक रडार दायर किया था: http://openradar.appspot.com/radar?id=5308200412774400 –

+3

मेरे पास एक ही समस्या थी और एमपीवीओएलयूवीव को उप-वर्गीकृत करने और एकल विधि को ओवरराइड करने में क्या मदद मिली - (सीजीआरईटी) वॉल्यूम स्लाइडररक्टफोरबाउंड: (सीजीईआरईटी) सीमा { वापसी सीमाएं; } '। दुर्भाग्य से यह हालांकि एक कामकाज है। और मैंने यह नहीं देखा कि मार्ग बटन (उदाहरण के लिए एयरप्ले के लिए) प्रस्तुत किए जाने पर यह कैसे काम करता है। दूसरी तरफ, ऐप्पल अब ऐप में यह बटन नहीं दिखाता है, क्योंकि यह आईओएस 7 के बाद से नियंत्रण केंद्र में प्रस्तुत किया गया है, इसलिए मैं इसे भी नहीं दिखाता और मेरे लिए यह समाधान अच्छा काम करता है। – Anastasia

उत्तर

0

मैं पुष्टि करता हूं कि यह समस्या अभी भी आईओएस 8 में मौजूद है। उपरोक्त टिप्पणियों में से एक में अनास्तासिया द्वारा प्रदान किया गया वर्कअराउंड (वॉल्यूम स्लाइडररेटफोरबाउंड ओवरराइडिंग के साथ) काम करता है लेकिन केवल तभी जब रूट बटन नहीं है वर्तमान। जब यह मौजूद होता है तो स्लाइडर मार्ग बटन को ओवरलैप करता है और इसे अब दबाया नहीं जा सकता है।

मैंने अपने समाधान का एक सरल संशोधन किया है, शायद कोई इसे वर्कअराउंड के रूप में उपयोग कर सकता है, जब तक कि ऐप्पल ठीक न हो या बेहतर समाधान प्रदान न हो जाए।

- (CGRect)volumeSliderRectForBounds:(CGRect)bounds 
{ 
    if (self.showsRouteButton) { 
     NSInteger spacer = 10; /* Space between Route button and Volume slider */ 
     CGRect routeButtonRect = [self routeButtonRectForBounds:bounds]; 
     bounds.size.width -= (routeButtonRect.size.width + spacer); 
    } 
    return bounds; 
} 

मुझे स्पेसर मूल्य हार्डकोडिंग पसंद नहीं है, लेकिन मुझे यह नहीं पता कि गतिशील रूप से इसकी गणना कैसे करें।

2

इस व्यवहार को हटाने का एक संभावित तरीका MPVolumeView को उपclass करना है और [super layoutSubviews] के बाद कुछ अतिरिक्त कार्य करना है।

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    [self cg_recursiveRemoveAnimationsOnView:self]; 
} 

- (void)cg_recursiveRemoveAnimationsOnView:(UIView *)view 
{ 
    [view.layer removeAllAnimations]; 
    for (UIView *subview in view.subviews) { 
     [self cg_recursiveRemoveAnimationsOnView:subview]; 
    } 
} 

यह सभी सम्मिलित एनिमेशन हटा देता है। तो सुनिश्चित करें कि आप यही चाहते हैं, क्योंकि यह काफी अधिक है। कोई भी position और bounds एनिमेशन को हटा सकता है (removeAnimationForKey: देखें)।

+0

'UIView.performWithoutAnimation' का उपयोग क्यों न करें - बहुत आसान –

+0

आपका मतलब' -performWithoutAnimation' के साथ '[super layoutSubviews]' को लपेटना है? यह काम नहीं करता है क्योंकि एनीमेशन कहीं और बनाए जाते हैं और MPVolumeView के भीतर प्रत्येक परत में 'UIView' प्रतिनिधि नहीं है। – CipherCom

+0

इसे आपकी विधि के समान कार्य करना चाहिए। यदि नहीं, एनीमेशन एक सीए एनीमेशन है, जो कि और भी अनोखा है। –