2010-12-27 14 views
9

में पारदर्शी में मॉडल पृष्ठभूमि रंग को कैसे बदलें, मैं एक पारदर्शी पृष्ठभूमि रंग के साथ एक मोडल दृश्य देखना चाहता हूं, ताकि इसके पीछे दृश्य उपयोगकर्ता द्वारा देखा जा सके।उद्देश्य-सी

+1

आप [UIcolor clearcolor] का उपयोग कर सकते हैं; – Raxit

+0

यह आईओएस के लिए है, है ना? – BoltClock

+0

आप किस मोडल डायलॉग का उपयोग कर रहे हैं? – Eiko

उत्तर

3

आईओएस सामान्य रूप से दृश्य प्रस्तुत करते समय पारदर्शिता का समर्थन नहीं करता है।

+1

हाँ मुझे लगता है। अब तक आईओएस मोडल में पारदर्शिता का समर्थन नहीं करता है। आपके उत्तर machunter के लिए धन्यवाद। :) – Rizki

+0

अच्छी तरह से, यह जानकर कि –

+0

हालांकि यह मदद नहीं करता है, यह गलत है, मैं इसे ट्रांसपरेंसी के साथ करता हूं। – DeyaEldeen

0

शायद आप अपने वर्तमान दृश्य में ओवरव्यू के रूप में एक UIView जोड़ना चाहते हैं लेकिन इसे पारदर्शी या अर्द्ध पारदर्शी पृष्ठभूमि के साथ पूर्णस्क्रीन करें। इस सवाल का जवाब पहले देखें:

disable elements on UIView behind modal UIView

0

आप इसे पीछे की ओर, एक तरह से काम करने की जरूरत। अपना मोडल व्यू लोड करें, फिर अपने सभी तत्वों को "मैन्युअल रूप से" सबव्यूव के रूप में जोड़ें, इस तरह वे पीछे छिपाए नहीं जाएंगे। हां, यह बहुत कोडिंग है, लेकिन किया जा सकता है। मैंने मूवी प्लेयर के लिए छोटे फ्रेम आकार को सेट करके और सबव्यू के रूप में इसके आसपास कुछ बटन और टेक्स्टव्यू फेंककर फिल्मों पर फिल्में चलाने और स्क्रीन पर अतिरिक्त तत्व रखने के लिए किया। बी

10

ठीक है, तो वर्तमान मॉड्यूल व्यू कंट्रोलर इस व्यवहार की पेशकश नहीं करता है ... हालांकि यह अभी भी संभव है। मैंने एक श्रेणी बनाई है जो मेरे लिए काम करती है (और उम्मीद है कि आप)। एक अतिरिक्त बोनस के रूप में, यह एक ही समय में मोडल विचारों को खारिज करने और प्रस्तुत करने से संबंधित दुर्घटनाओं को भी रोकता है!

हैडर फ़ाइल:

// 
// UIViewController+overView.h 
// Created by Kevin Lohman on 5/30/12. 
// 

#import <UIKit/UIKit.h> 

@interface UIViewController (OverView) 
- (void)presentOverViewController:(UIViewController *)modalViewController animated:(BOOL)animated; 
- (void)dismissOverViewControllerAnimated:(BOOL)animated; 
@end 

कार्यान्वयन फ़ाइल:

// 
// UIViewController+overView.m 
// Created by Kevin Lohman on 5/30/12. 
// 

#import "UIViewController+overView.h" 

@implementation UIViewController (OverView) 

#define kUIViewControllerOverViewDismissNotification @"OverViewDismissNotification" 

const float kUIViewControllerOverViewAnimationDuration = 0.75; 
const NSInteger kUIViewControllerOverViewTag = 8008135; // Arbitrary number, so as not to conflict 
- (void)overViewDismissed 
{ 
    [self autorelease]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:kUIViewControllerOverViewDismissNotification object:self.view]; 
} 

- (void)presentOverViewController:(UIViewController *)modalViewController animated:(BOOL)animated 
{ 
    UIView *toView = self.view; 

    CGRect finalRect = CGRectIntersection([[UIScreen mainScreen] applicationFrame], self.view.frame); // Make sure it doesn't go under menu bar 
    modalViewController.view.frame = finalRect; 
    modalViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 
    modalViewController.view.tag = kUIViewControllerOverViewTag+modalViewController.modalTransitionStyle; // Hiding some info here :) 

    if(animated) 
    { 
     switch(modalViewController.modalTransitionStyle) 
     { 
      // Currently only cross dissolve and cover vertical supported... if you add support let me know. 
      case UIModalTransitionStyleCrossDissolve: 
      { 
       float beforeAlpha = modalViewController.view.alpha; 
       modalViewController.view.alpha = 0; 
       [toView addSubview:modalViewController.view]; 
       [UIView animateWithDuration:kUIViewControllerOverViewAnimationDuration animations:^{ 
        modalViewController.view.alpha = beforeAlpha; 
       }]; 
       break; 
      } 
      case UIModalTransitionStyleCoverVertical: 
      default: 
      { 
       modalViewController.view.frame = CGRectMake(modalViewController.view.frame.origin.x, modalViewController.view.frame.size.height, 
                  modalViewController.view.frame.size.width, modalViewController.view.frame.size.height); 
       [toView addSubview:modalViewController.view]; 
       [UIView animateWithDuration:kUIViewControllerOverViewAnimationDuration animations:^{ 
        modalViewController.view.frame = finalRect; 
       }]; 
       break; 
      } 
     } 
    } 
    else { 
     [toView addSubview:modalViewController.view]; 
    } 

    [modalViewController retain]; // Keep it around until we dismiss it. 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(overViewDismissed) name:kUIViewControllerOverViewDismissNotification object:modalViewController.view]; // Release will happen when this notification is posted 
} 

NSInteger transitionStyleForTag(tag) 
{ 
    if (tag >= kUIViewControllerOverViewTag && tag <= kUIViewControllerOverViewTag+UIModalTransitionStylePartialCurl) 
    { 
     return tag-kUIViewControllerOverViewTag; 
    } 
    else { 
     return -1; // Not a Over View 
    } 
} 

- (void)dismissOverViewControllerAnimated:(BOOL)animated 
{ 
    UIView *overView = transitionStyleForTag(self.view.tag) >= 0 ? self.view : nil; // Can dismiss ourselves 
    for(UIView *subview in self.view.subviews) 
    { 
     if(transitionStyleForTag(subview.tag) >= 0) 
      overView = subview; // Keep going, lets dismiss last presented first 
    } 
    if(!overView) return; // None to dismiss 

    if(animated) 
    { 
     switch(transitionStyleForTag(overView.tag)) 
     { 
      // Currently only cross dissolve and cover vertical supported... if you add support let me know. 
      case UIModalTransitionStyleCrossDissolve: 
      { 
       float beforeAlpha = overView.alpha; 
       [UIView animateWithDuration:kUIViewControllerOverViewAnimationDuration animations:^{ 
        overView.alpha = 0; 
       } completion:^(BOOL finished) { 
        [overView removeFromSuperview]; 
        overView.alpha = beforeAlpha; 
        [[NSNotificationCenter defaultCenter] postNotificationName:kUIViewControllerOverViewDismissNotification object:overView]; 
       }]; 
       break; 
      } 
      case UIModalTransitionStyleCoverVertical: 
      default: 
      { 
       [UIView animateWithDuration:kUIViewControllerOverViewAnimationDuration animations:^{ 
        overView.frame = CGRectMake(0, overView.frame.size.height, overView.frame.size.width, overView.frame.size.height); 
       } completion:^(BOOL finished) { 
        [overView removeFromSuperview]; 
        [[NSNotificationCenter defaultCenter] postNotificationName:kUIViewControllerOverViewDismissNotification object:overView]; 
       }]; 
       break; 
      } 
     } 
    } 
    else { 
     [overView removeFromSuperview]; 
     [[NSNotificationCenter defaultCenter] postNotificationName:kUIViewControllerOverViewDismissNotification object:overView]; 
    } 
} 
@end 

और फिर इसका इस्तेमाल करने के लिए, बस presentOverViewController बजाय presentModalViewController और dismissOverViewController बजाय dissmissModalViewController का उपयोग करें।

सीमाओं के एक जोड़े हैं:

  1. आप रूट सबसे दृश्य नियंत्रक को पेश करने के लिए है, तो अगर आप चाहते हैं पूरे स्क्रीन कवर करने के लिए और आप एक के अंदर एक कुलपति मिल गया है UINavigationController, इसे नेविगेशन नियंत्रक के लिए प्रस्तुत करते हैं।
  2. रोटेशन के साथ कुछ मुद्दों (मैं किसी भी नहीं देखा) पुराने iOS पर बनाता है (4.0 या तो)
  3. वर्तमान में केवल संभालती क्रॉस भंग और कवर कार्यक्षेत्र एनिमेशन हो सकता है।

    self.modalPresentationStyle = UIModalPresentationCurrentContext; 
    

    यह एक बार मोडल दृश्य है निकाले जाने से जनक दृश्य बंद हो जाएगा:

+0

अच्छा और साफ समाधान, धन्यवाद! यद्यपि दो अवलोकन। सबसे पहले, अधिसूचना के हैंडलर 'ओवर व्यूडिस्मिस्ड' मोडल व्यू कंट्रोलर की बजाय स्वयं को रिलीज़ करता है और इससे क्रैश हो जाता है। अधिसूचना कोड addObserver/postNotification को पूरी तरह हटाएं और मौजूदा/खारिज विधियों के बाहर मोडल व्यू कंट्रोलर की मेमोरी प्रबंधित करें। दूसरा, '[[यूआईस्क्रीन मुख्यस्क्रीन] एप्लिकेशनफ्रेम] हमेशा सही फ्रेम आकार नहीं देता है। मैं इसके बजाय 'self.view.superview.frame' का उपयोग करता हूं (देखें [यह उत्तर] (http://stackoverflow.com/a/4052442/22764))। –

+0

@VladimirGrigorov हे नोट के लिए धन्यवाद, ऐसा लगता है कि वहां कुछ खराब तर्क है। मुझे याद नहीं है कि मैंने किस कोडबेस को रखा है, लेकिन कल्पना करें कि मैंने इसे स्थानीय रूप से तय किया है ... यदि आप अभी भी इसके किसी निश्चित संस्करण को संकलित/चला रहे हैं, तो क्या आप अपने निष्कर्षों के आधार पर उत्तर संपादित कर सकते हैं? मैं इसे बदल सकता हूं (क्या यह सिर्फ [स्वयं autorelease] [self.parentViewController autorelease] में बदल गया है? मेरे लिए परिवर्तन को अंधाधुंध बनाने के लिए जोखिम भरा :) – BadPirate

+0

मैंने पहले ही टिप्पणी में कहा है कि मैंने अधिसूचना कोड हटा दिया है और उस संस्करण में उत्तीर्ण परीक्षण ... –

9

मेरे लिए जवाब है, कोड की एक पंक्ति थी मोडल दृश्य नियंत्रक प्रस्तुत करने से पहले माता-पिता को देखने के नियंत्रक को जोड़ा गया जोड़ा गया है।

+0

यह मेरे लिए काम नहीं कर रहा था। –

+0

मेरी मदद नहीं की। – surfrider

+6

लेकिन यह स्वयं काम करता है। NavigationController.modalPresentationStyle = UIModalPresentationCurrentContext; – surfrider