2012-01-08 9 views
27

आदेश में UIAlertView के व्यवहार की तरह सभी विचारों के शीर्ष पर एक UIView बनाने के लिए, सबसे अच्छा तरीका है मैं देख रहा हूँ एप्लिकेशन विंडो, जो जोड़कर है में इसके सामने है देखें:दृश्य: UIWindow subview वी.एस. UIViewController subview

[[[UIApplication sharedApplication] delegate] window] 

हालांकि, मुझे पता चला कि नकारात्मकता यह स्वचालित रूप से घूर्णन में नहीं लेती है। घूर्णन में लेने के लिए, सबसे अच्छा तरीका वर्तमान ऐपडिलेगेट window.navigationController/rootViewController पर दृश्य जोड़कर है, हालांकि, ऐसा करके यह अब सब कुछ के शीर्ष पर नहीं होगा। मान लें कि जब दृश्य प्रदर्शित होता है और एक modalViewController पॉपअप होता है, तो मोडल व्यू निश्चित रूप से दृश्य को कवर करेगा।

मेरा सवाल है, क्या शीर्ष विंडो और समर्थन अभिविन्यास में सबव्यूव जोड़ना संभव है? क्या मुझे इस मामले में निब फ़ाइल के दो सेट चाहिए? कैसे UIAlertView जादू को शीर्ष & अभिविन्यास समर्थन को जोड़ती है? जब मैं UIAlertView.h में देखता हूं, तो मुझे लगता है कि वास्तव में 2 UIWindows है, जिसे एक बार originalWindow कहा जाता है और दूसरा dimWindow कहलाता है। क्या कोई ऐसी जगह है जहां मुझे UIAlertView.m के लिए स्रोत कोड मिल सकता है?

उत्तर

4

केवल UIWindow का पहला सबव्यूशन अभिविन्यास परिवर्तनों के बारे में बताया जाता है। (< iOS8)

आपका प्रश्न बहुत ही इस एक के समान है:

Multiple views in a UIWindow

जवाब कहते हैं, आप उन्मुखीकरण परिवर्तन की सूचनाओं के लिए रजिस्टर और subview 'शीर्ष पर' अपने से relayout संभाल कर सकते हैं के रूप में उस तरफ।

+1

रोटेशन ईवेंट प्राप्त करने के लिए डिवाइस को दृश्य को कैसे पंजीकृत करें? यह नियंत्रक नहीं देखता है, इसलिए इसके लिए कोई प्रतिनिधि कार्य नहीं है। क्या मुझे UIDeviceOrientationDidChangeNotification को इसी अभिविन्यास में बदलने के लिए पकड़ना है? –

2

यहां एक संभावित समाधान है, मैं कुछ चरणों में समझा रहा हूं।

  1. प्रारंभ UIView के बजाय एक UIViewController विरासत में मिला वर्ग के साथ, चलो का कहना है कि वर्ग TopViewController द्वारा UIViewController
  2. विरासत में मिला है क्या आप पंजीकृत नहीं कर सकता डिवाइस/इंटरफ़ेस रोटेशन UIView में वर्ग विरासत में मिला के बाद से नामित, TopViewController वर्ग जो UIViewController से प्राप्त होती है रोटेशन घटनाओं को देखने के तरीकों का जवाब है। घूर्णन घटनाओं को अब कब्जा कर लिया जा सकता है।
  3. आखिर में आप पर UIWindow के शीर्ष पर देख सकते हैं कि आपने अपने प्रश्न में उल्लेख किया गया है।

    [[[[UIApplication sharedApplication] delegate] window] addSubview:(TopViewController object).view]; 
    

आशा इस मदद करता है।

+0

UIViewController की दृश्य संपत्ति भी घूमती नहीं है। दुर्भाग्य से। https://developer.apple.com/library/ios/qa/qa1688/_index.html – khunshan

15

मुझे मिला सबसे अच्छा समाधान एक पारदर्शी कंटेनर व्यू बनाना है, उस कंटेनर को विंडो में जोड़ें, और कंटेनर के अंदर अपनी अलर्ट रखें। फिर आप घूर्णन घटनाओं को प्राप्त करने और कंटेनर को बदलने के लिए UIApplicationWillChangeStatusBarOrientationNotification के लिए पंजीकरण कर सकते हैं;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    ... 
    self.container = [[UIView alloc] initWithFrame:self.window.bounds]; 
    [self.container addSubview:self.alertView]; 
    [self.window addSubview:self.container]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(statusBarWillRotate:) 
                name:UIApplicationWillChangeStatusBarOrientationNotification 
               object:nil]; 
    ... 
} 
... 
- (void)statusBarWillRotate:(NSNotification *)theNotification 
{ 
    CGFloat rotation = 0; 
    switch ([notification[UIApplicationStatusBarOrientationUserInfoKey] intValue]) 
    { 
     case UIInterfaceOrientationLandscapeLeft: 
      rotation = -M_PI_2; 
      break; 
     case UIInterfaceOrientationLandscapeRight: 
      rotation = M_PI_2; 
      break; 
     case UIInterfaceOrientationPortraitUpsideDown: 
      rotation = M_PI; 
      break; 
     case UIInterfaceOrientationPortrait: 
     default: 
      rotation = 0; 
      break; 
    } 
    CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(rotation); 
    CGSize rotatedSize = CGRectApplyAffineTransform(self.window.bounds, rotationTransform).size; 
    [UIView animationWithDuration:[UIApplication sharedApplication].statusBarOrientationAnimationDuration 
         animations:^{ 
     self.container.transform = rotationTransform; 
     // Transform invalidates the frame, so use bounds/center 
     self.container.bounds = CGRectMake(0, 0, rotatedSize.width, rotatedSize.height); 
     self.container.center = CGPointMake(self.window.bounds.size.width/2, self.window.bounds.size.height/2); 
    }]; 
} 

आप, यदि वास्तव में चाहते हैं, एक पूरी तरह से नई विंडो इसके windowLevel संपत्ति UIWindowLevelAlert करने के लिए सेट के साथ बना सकते हैं, जो गारंटी देगा कि खिड़की अन्य सभी से ऊपर रहते हैं: यह आप स्वतंत्र रूप से चेतावनी के फ्रेम में हेरफेर करने की अनुमति देता है कीबोर्ड सहित विचार, लेकिन खिड़की प्रबंधन थोड़ा मुश्किल हो जाता है।उपरोक्त समाधान अधिकांश आवश्यकताओं के लिए पर्याप्त होना चाहिए।

बस एक खिड़की के लिए एक दृश्य नियंत्रक के दृष्टिकोण को जोड़ने के साथ समस्या यह है कि जब तक यह रूट दृश्य नियंत्रक पर addChildViewController: के माध्यम से दृश्य नियंत्रक पदानुक्रम में जोड़ा जाता है सब रोटेशन और view[Will|Did][Disa|A]ppear: संदेश प्राप्त करने की गारंटी नहीं है है।

+0

मुझे इस समाधान के साथ कोई समस्या है। मैं उस शीर्षतम कंटेनर दृश्य में छूने में सक्षम नहीं हूं। UIButtons उदाहरण के लिए काम नहीं करता है। – asendra

+0

@asendra आपकी खिड़की की तरह लगता है कि महत्वपूर्ण खिड़की नहीं है, लेकिन आप अपना खुद का प्रश्न अधिक विस्तार से पोस्ट करना चाहेंगे। – Austin

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