2011-05-13 12 views
6

मुझे पता है कि मेरे प्रश्न का शीर्षक इतना बुरा है, लेकिन मुझे नहीं पता कि इसका वर्णन कैसे किया जाए।आईफोन - फोकस प्रभाव (बस UIAlertView की तरह)

जब कोई UIAlertView पॉप अप हो जाता है, तो स्क्रीन पर कुछ भी (UIAlertView को छोड़कर) थोड़ा गहरा हो जाता है लेकिन देखा जा सकता है। मैं इसे फोकस प्रभाव के रूप में कहता हूं, क्योंकि आप स्पष्ट रूप से और सीधे जानते होंगे कि अब UIAlertView फोकस है।

तो मैं इस तरह के फोकस प्रभाव को कैसे कार्यान्वित कर सकता हूं?

धन्यवाद

उत्तर

4

बस दृश्य आप पर "ध्यान केंद्रित" करना चाहते हैं तो नीचे दिए गए एक पारदर्शी दृश्य जोड़ने। सरल उदाहरण:

UIView *shieldView = [[[UIView alloc] initWithFrame:myView.bounds] autorelease]; 
shieldView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.7]; 
[myView.superview insertSubview:shieldView belowSubview:myView]; 

UIAlertView वास्तव में, बजाय एक रेडियल ग्रेडिएंट एक साधारण रंग के साथ एक छवि का उपयोग करता है के क्रम दृश्य के मध्य उजागर करने के लिए।

+0

इस कोड का प्रयोग करें रेडियल ग्रेडिएंट पृष्ठभूमि उत्पन्न करने के लिए मैंने यह कोशिश की, लेकिन यह वास्तव में अच्छा नहीं लग रहा है :( – Jack

+1

"अच्छा नहीं" से आपका क्या मतलब है? जैसा कि मैंने कहा, उदाहरण सरल है ईडी। एक वास्तविक दुनिया ऐप में, आप अधिकतर फीड-इन/आउट एनिमेशन जोड़ सकते हैं और एक साधारण रंग की बजाय ढाल छवि का उपयोग कर सकते हैं ... – omz

+0

मुझे लगता है कि मुझे पहले शील्ड व्यू के लिए फीका-इन/आउट एनिमेट करना चाहिए, और फिर पॉप मेरा ध्यान केंद्रित दृष्टिकोण? – Jack

2

UIAlertView इस तरह काम करता है। यह पृष्ठभूमि को मंद करने के लिए अल्फा मास्क छवि में fades। एक बार जब एनीमेशन समाप्त हो जाता है तो यह संवाद के एनीमेशन में "उछाल" शुरू करता है।

तो इसे पुन: पेश करने के लिए आपको सबसे पहले "उज्ज्वल स्थान" के साथ अल्फा मास्क उत्पन्न करने की आवश्यकता है जहां आपका संवाद समाप्त हो जाएगा और उसमें फीका होगा। फिर बाउंस प्रभाव प्राप्त करने के लिए एक (कुछ) फ्रेम एनीमेशन का उपयोग करें। यहाँ

और जानकारी: Creating a Pop animation similar to the presentation of UIAlertView

+0

मुझे लगता है कि UIAlertView को उसी समय बाउंस किया गया है जब मास्क छवि डाimming एनीमेशन शुरू करती है, केवल एनीमेशन की अवधि 0.3 सेकंड शॉट होती है ?? – Jack

+0

मैंने कभी भी ऐप्पल सामान का समय नहीं लगाया है। यदि आप इसे Google करते हैं तो आपको ऐसे लोग मिलेंगे जो हैं। मैं बस आपको मूलभूत विचार देना चाहता था कि आपको इसे पुन: पेश करने की क्या ज़रूरत है। या तो एक रेडियल ब्लर के साथ एक छवि बनाएं, सिम्युलेटर पर एक ट्रांसफॉर्म दाएं से विकृत हो और इसे सेव करें या जिंप या फ़ोटोशॉप का उपयोग करें। समय आपके और कोरएनीमेशन के बीच है ;-) बीटीडब्ल्यू यह सिर्फ अटकलें नहीं है, मैंने ऐसा करने के लिए कोड लिखा है लेकिन यह ग्राहकों के लिए था इसलिए साझा नहीं कर सकता! – idz

0

बेहतर "अच्छा नहीं" आप कर सकते थे की तुलना में बनाने के लिए ...

  1. एक निब में एक UIView बनाने के (सबसे आसान है, तो अपने कोड का हिस्सा है जहां आप प्रभाव की आवश्यकता पहले से ही एक निब का उपयोग कर रही है) और फिर उस दृश्य में एक पारदर्शी ग्राफिक ('फोकस' प्रभाव के साथ) जोड़ें।

  2. (OMZ उदाहरण यह दिखाता है)

4

मैं जानता हूँ कि इस पोस्ट थोड़ा पुराना है दृश्य पदानुक्रम में एक एनीमेशन का उपयोग कर ग्राफिक में एक IBOutlet

  • फीका करने के लिए निब में UIView कनेक्ट लेकिन मैंने सोचा कि यह किसी की मदद कर सकता है।

    - (UIImage *)radialGradientImage:(CGSize)size start:(float)start end:(float)end centre:(CGPoint)centre radius:(float)radius{ 
    UIGraphicsBeginImageContextWithOptions(size, YES, 1); 
    
    size_t count = 2; 
    CGFloat locations[2] = {0.0, 1.0}; 
    CGFloat components[8] = {start, start, start, 1.0, end, end, end, 1.0}; 
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGGradientRef grad = CGGradientCreateWithColorComponents (colorSpace, components, locations, count); 
    CGColorSpaceRelease(colorSpace); 
    
    CGContextDrawRadialGradient (UIGraphicsGetCurrentContext(), grad, centre, 0, centre, radius, kCGGradientDrawsAfterEndLocation); 
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    
    CGGradientRelease(grad); 
    UIGraphicsEndImageContext(); 
    return image;} 
    

    तो जैसे ज फ़ाइल में ढाल परिभाषित करें::

    UIImageView *gradient; 
    

    इसलिए की तरह अपने ढाल कॉल करें:

    - (void)addGradient{ 
    CGSize size = self.view.bounds.size; 
    CGPoint centre = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2); 
    
    float startColor = 1.0f; 
    float endColor = 0.0f; 
    float radius = MIN(self.view.bounds.size.width/4, self.view.bounds.size.height/4); 
    
    gradient = [[UIImageView alloc] initWithImage:[self radialGradientImage:size 
                        start:startColor 
                        end:endColor 
                       centre:centre 
                       radius:radius]]; 
    
    [gradient setBackgroundColor:[UIColor clearColor]]; 
    [gradient setUserInteractionEnabled:YES]; 
    [gradient setAlpha:0.6f]; 
    [self.view addSubview:gradient];} 
    
  • +0

    यह एक क्षेत्र की तरह दिखता है .. –

    +0

    मुझे पता चला है कि यदि आप फ्लोट त्रिज्या = MIN (self.view.bounds.size.width, self.view.bounds.size.height) करते हैं; यह बहुत बेहतर दिखता है। –

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