8

iOS 8'de Gezinme çubuğu ve yön değiştirme ile ilgili garip bir davranışım var.iOS 8: Portre görünümünde bir model görünümü denetleyicisi sunulması, temeldeki yatay gezinme denetleyicisinin gezinme çubuğunun yeniden boyutlandırılmasına neden olur.

Desteklenen arabirim yönelimini UIInterfaceOrientationMaskLandscapeRight bildiren bir gezinme denetleyicim var. Gezinme çubuğu yatay yön için beklenen yüksekliğe sahiptir (ne yazık ki ekran görüntülerini gönderme hakkım yoktur).

Daha sonra yalnızca UIInterfaceOrientationMaskPortrait'u destekleyen bir görünüm denetleyicisinin kalıcı bir sunumunu başlatıyorum. Sunum animasyonu başladığında, altta yatan gezinme denetleyicisinin metrikleri, bir dikey sunum olarak değiştirilir, çünkü gezinti çubuğunun yüksekliği, yukarıda gösterildiği gibi, dikey boyutuna büyür.

iOS 7 bu davranış sergiliyor. Neyi kaçırıyorum? Eski davranışı geri yüklemek istiyorum.

@implementation AppDelegate 

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


    DOGButtonViewController *root = [DOGButtonViewController new]; 
    DOGOrientedNavigationController *navi = [[DOGOrientedNavigationController alloc] initWithRootViewController:root]; 
    navi.allowedInterfaceOrientations = UIInterfaceOrientationMaskLandscapeRight; 

    self.window.rootViewController = navi; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortrait; 
} 

@end 


@implementation DOGOrientedNavigationController 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return self.allowedInterfaceOrientations; 
} 

@end 

@implementation DOGButtonViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.title = @"Button View Controller"; 
} 

- (BOOL)prefersStatusBarHidden 
{ 
    return YES; 
} 

- (IBAction)buttonClicked:(id)sender 
{ 
    DOGPortraitViewController *vc = [DOGPortraitViewController new]; 
    [self presentViewController:vc animated:YES completion:nil]; 
} 

@end 

@implementation DOGPortraitViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.title = @"Portrait Title"; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

- (IBAction)buttonClicked:(id)sender 
{ 
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 
} 

- (BOOL)prefersStatusBarHidden 
{ 
    return YES; 
} 

@end 

daha karmaşık bir kurulumda Ayrıca navigasyon kontrolörü bulunan bir UIWebView metni yaşamaya portre modal sunarken büyütülmüştür:

İşte yukarıdaki basit örnekte tam kodudur. Modal işten çıkarıldığında, metin orijinal boyutuna yeniden boyutlandırılmaz.

+0

yeniden göründüğünde bu ekran görüntüsünü kaldırmak zorunda? Ben de aynı şeyi yaşıyorum –

+0

Ne yazık ki değil, ama önümüzdeki günlerde buna bakacağım. – thewulf

+0

Benzer sorun burada. Görünen görünüm denetleyicisi de dönüyor gibi görünüyor (olmamasına rağmen) – Carlos

cevap

0

Daha iyi bir seçenek olmaması için bunun için bir miktar çuval yaptım. Temel olarak, modal görünüşü göstermeden önce bir ekran görüntüsü alıyorum ve onu sunan görüntü denetleyicinin üstüne bırakıyorum.

Açıkçası ben görünümü buna bir çözüm bulmak için yönetmek mi

func showScreenShot() { 
    let image = screenShot() 
    self.screenShotImageView = UIImageView(image: image) 
    self.view.addSubview(self.screenShotImageView!) 
    } 

func screenShot() -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, true, UIScreen.mainScreen().scale) 
    self.view.layer.renderInContext(UIGraphicsGetCurrentContext()) 
    let image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image 
} 

func removeScreenShot() { 
    if let screenImageView = self.screenShotImageView { 
    screenImageView.removeFromSuperview() 
    self.screenShotImageView = nil 
    } 
} 
İlgili konular