2014-09-25 9 views
17

मेरे पास एक खाली एप्लिकेशन है और इसमें कोई स्टोरीबोर्ड या xib शामिल नहीं है। मैं एक छिपी स्थिति बार चाहता हूं और केवल परिदृश्य अभिविन्यास का समर्थन करता हूं। दोबारा, मैं केवल उन कोडों को कोड के भीतर नहीं बनाना चाहता हूं और Info.plist को स्पर्श नहीं करता हूं।परिदृश्य अभिविन्यास का उपयोग करते समय गलत आकार के साथ UIWindow

समस्या

मैं एक नियंत्रक कि कहते हैं केवल समर्थित उन्मुखीकरण परिदृश्य है के साथ एक UIWindow पैदा करते हैं। उस स्थिति में मेरा UIWindow पोर्ट्रेट मोड के आयाम में बनाया गया है और घुमाने नहीं है। अपेक्षित परिणाम एक स्क्रीन होगी जो पूरी तरह से साइयन है।

#import "AppDelegate.h" 
#import "AppViewController.h" 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    self.window.backgroundColor = [UIColor cyanColor]; 
    self.window.rootViewController = [[AppViewController alloc] init]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

@end 

यह मेरा नियंत्रक है:

Broken UIWindow

यह मेरा प्रतिनिधि है

#import "AppViewController.h" 

@implementation AppViewController 

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
    return UIInterfaceOrientationLandscapeLeft; 
} 

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

@end 

क्या मैं इतनी कोशिश की है अब तक

अगर मैं के बाद rootViewController सेट कॉलिंग बनाना और अदृश्य सबकुछ पहले काम करना प्रतीत होता है।

self.window.backgroundColor = [UIColor cyanColor]; 
[self.window makeKeyAndVisible]; 
self.window.rootViewController = [[AppViewController alloc] init]; 

अभी भी कुछ समस्याएं हैं। सबसे पहले मुझे यह पसंद नहीं है क्योंकि यह बहुत नाजुक लगता है।

Broken GLKViewController

ऐसा लगता है कि स्थिति पट्टी नहीं है: दूसरा समस्या यह है कि एक अधिक जटिल आवेदन rootViewController मैं निम्नलिखित परिणाम प्राप्त के रूप में एक GLKViewController सेट कि में (उम्मीद बाईं तरफ कोई काला क्षेत्र होगा) है पर्याप्त जल्दी छुपाया। कई इशारा recognizers सक्रिय और GLKViewController में हैं और काला क्षेत्र पर क्लिक निम्नलिखित लॉग संदेश पैदावार:

2014-09-25 13: 20: 42.170 StackOverflowExample [6971: 107,907] में अप्रत्याशित नहीं के बराबर खिड़की _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow: UIClassicWindow: 0x7fa20b805e00; फ्रेम = (0 0; 375 667); userInteractionEnabled = नहीं; इशारा रिकॉग्नाइज़र = एनएसएआरएआरई: 0x7fa20b80a620; परत = UIWindowLayer: 0x7fa20b806890

मैं भी एक खाली UIViewController संलग्न और एक उप-दृश्य के रूप में मेरे विचार को जैसे चाहें, विभिन्न अन्य परिवर्तन का प्रदर्शन किया। उस स्थिति में मेरा विचार सही दिखता है लेकिन खिड़की अभी भी गलत आयामों का उपयोग कर रही है।

सब कुछ सही घुमाता है अगर मैं अपने व्यू कंट्रोलर में समर्थित इंटरफेसऑरिएंटेशन विधियों को ओवरराइड नहीं करता हूं। लेकिन यह निश्चित रूप से नहीं है जो मैं चाहता हूं।

उत्तर

24

आप चित्र मोड UIScreen iOS 8 में चित्र सीमा (केवल यदि आप एप्लिकेशन स्विच पैनल में नहीं इस अनुप्रयोग है के रूप में iOS 8 कुछ कैश करता है) से परिदृश्य एप्लिकेशन चलाते हैं। यहां तक ​​कि makeKeyAndVisible के साथ विंडो प्रदर्शित करने से यह फ्रेम नहीं बदलता है। लेकिन यह AppViewController उपलब्ध अभिविन्यास के अनुसार [UIScreen mainScreen].bounds बदलता है।

#import "AppDelegate.h" 
#import "AppViewController.h" 

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Portrait bounds at this point 
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

    self.window.backgroundColor = [UIColor cyanColor]; 
    self.window.rootViewController = [[AppViewController alloc] init]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

@end 

तो चलो के बाद [self.window makeKeyAndVisible]

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [UIWindow new]; 
    self.window.backgroundColor = [UIColor cyanColor]; 
    self.window.rootViewController = [[AppViewController alloc] init]; 
    [self.window makeKeyAndVisible]; 

    // Here it is 
    self.window.frame = [UIScreen mainScreen].bounds; 
    return YES; 
} 

मुझे लगता है कि यह iOS 8 बग है खिड़की के फ्रेम बदल देते हैं।

+1

साझा करने के लिए धन्यवाद। मैंने यह जानने का प्रयास करने में कई घंटे बिताए कि इसे कैसे किया जाए। –

+0

आईओएस 8.1 के साथ और स्विफ्ट का उपयोग करके मुझे अपनी समस्या को हल करने के लिए UIWindow की चौड़ाई और ऊंचाई पर एक छोटा सा अंश जोड़ने की आवश्यकता है: http://stackoverflow.com/a/26452679/190599 – CodeReaper

+0

बहुत अच्छा काम करता है, धन्यवाद बहुत। –

0

जब एक लॉन्च स्क्रीन है, जो आप केवल Info.plist

अपने आप को इस समस्या थी के लिए एक अतिरिक्त संपत्ति जोड़कर कर सकते हैं जोड़ने समस्या हल हो रहा है, मुझे यकीन है कि आप कोड के माध्यम से इसे जोड़ सकते हैं, तो नहीं कर रहा हूँ हालांकि, मैं केवल यह Info.plist + लॉन्च स्क्रीन xib फ़ाइल के साथ कार्य

<key>UILaunchStoryboardName</key> 
<string>Launch Screen</string> 

असल में मैं तुम्हें एक xib फ़ाइल जोड़ने के लिए, अगर बस कुंजी (किसी भी कीमत के साथ) उपलब्ध है नहीं लगता है बनाने में कामयाब plist में यह काम करना चाहिए।

+0

दुर्भाग्यवश मेरे लिए ऐसा नहीं किया। –

8

मैं एक चित्र-ऐप्लिकेशन के लिए एक समान समस्या थी,।

मैं इससे पहले कि आपके मामले में UIWindow

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Init my stuff 
    // ... 

    // Prepare window 
    [application setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; // prevent start orientation bug 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

का दृष्टांत, आप setStatusBarOrientation:animated: विधि में UIInterfaceOrienationLandscapeLeft (या दाएं) का उपयोग करना चाहिए स्थिति पट्टी उन्मुखीकरण सेट करके समस्या को तय की।

उम्मीद है कि यह आपकी मदद करता है।

+0

शानदार! अन्य समाधानों में से कोई भी काम नहीं किया – RawMean

0

यहां पोस्ट किए गए कोई भी समाधान या कहीं और मेरे लिए काम नहीं किया गया है।

हालांकि, मैंने पाया है कि इस मुद्दे को जाहिरा तौर पर स्टोरीबोर्ड उन के साथ नहीं होती है, तो कोई वैकल्पिक समाधान xibs से दूर ले जाने के लिए है। (यह तथ्य दुख की बात यह भी असंभव बनाता है कि ऐप्पल गंभीरता से समस्या उठाएगा।)

2

व्यक्तिगत रूप से, ऊपर प्रस्तुत किए गए समाधान में से कोई भी काम नहीं करता है। आखिर में मैंने अपने मुख्य xib में विंडो के लिए "छुपा" सेट किया, जैसा कि पहले यहां बताया गया था: unexpected nil window in _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow

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