簡體   English   中英

iPad模態控制器在旋轉后被解雇

[英]iPad modal controller is dismissed after rotation

我使用故事板segue設置為Form Sheet呈現模態視圖。 問題是,當我在顯示此視圖后旋轉iPad時,視圖將從視圖中移除/被解除。

我不知道為什么。 它似乎只在以縱向開始然后旋轉到橫向時發生。

如果我從橫向開始然后顯示視圖然后旋轉它保持在屏幕上罰款。

有任何想法嗎?

編輯----

旋轉后,全屏模態視圖似乎也被忽略了!

演示代碼中沒有任何特殊內容,這是一個全屏模式:

EditViewController *editView = [self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"editViewController"];
editView.delegate = self;
editView.image = image;
editView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

[self presentViewController:editView animated:YES completion:nil];

這在iOS 6和iOS 7上都會發生

編輯2 ----忘了提,我是從UISplitViewController的左/主視圖控制器呈現模態

很晚,但它對我有用的就是之前

[self presentViewController:aController animated:YES completion:nil];

關閉主控制器,添加此行

[self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModePrimaryHidden];
[self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModeAutomatic];

然后展示你的控制器

擺脫:editView.modalTransitionStyle = UIModalTransitionStyleFlipHorizo​​ntal; 這將解決您遇到的問題。 在iPad上顯示為窗體表的模態視圖控制器無法使用該過渡樣式正確旋轉。

它真的很難得到原因如何以及為什么會發生這種情況,因為我發現這也發生在UIPopover也是當你旋轉它UIPopover隱藏因為???

因此,如果您想保持視圖,那么只需在輪換后再次調用您的控制器即可獲得良好的用戶體驗

這不是它對UISplitViewController的限制的錯誤。 當masterViewController(它是一個UIPopoverController )能夠被解除時,存在問題。 下面是假設您的應用程序允許masterViewController在縱向中被解除並且不允許在橫向中使用它是如何工作的。

在masterViewController可見的情況下,如果您要從masterViewController中的viewController呈現模態然后旋轉到橫向,則模式將在iOS7中消失,並且應用程序不會在iOS8中旋轉。 iOS8引入了防止iOS7糟糕體驗的條件。 iOS7在將masterViewController從popoverController移動到splitViewController中包含的viewController的過程中丟失了模態。

模態需要從splitViewController而不是masterViewController中呈現。 唯一的問題是模式在縱向下呈現在masterViewController下面。 我的解決方案是關閉masterViewController然后呈現模態。

根據代碼的復雜程度,有幾種方法可以實現此結果。 這是我在我的應用程序中執行此操作的方式。

我首先將UISplitViewController子類UISplitViewController ,以便獲得對popoverController的引用。 我使用委托轉發來內部和外部訪問委托方法。 繼承人.h

// MainSplitViewController.h

#import <UIKit/UIKit.h>

@interface MainSplitViewController : UISplitViewController
@property (nonatomic, weak, readonly) UIPopoverController* primaryColumnController;
@end

還有他們

// MainSplitViewController.m

#import "MainSplitViewController.h"

@interface MainSplitViewController () <UISplitViewControllerDelegate>
@property (nonatomic, weak) id<UISplitViewControllerDelegate> externalDelegate;
@property (nonatomic, weak) UIPopoverController* primaryColumnController;
@end

@implementation MainSplitViewController

- (instancetype)init {
    self = [super init];
    if (self) {
        self.delegate = self;
    }
    return self;
}


#pragma mark - Split View Controller Delegate

- (void)splitViewController:(UISplitViewController *)svc popoverController:(UIPopoverController *)pc willPresentViewController:(UIViewController *)aViewController {
    self.primaryColumnController = pc;

    if ([(id)self.externalDelegate respondsToSelector:_cmd]) {
        [self.externalDelegate splitViewController:svc popoverController:pc willPresentViewController:aViewController];
    }
}


#pragma mark - Delegate Forwarder

- (void)setDelegate:(id<UISplitViewControllerDelegate>)delegate {
    [super setDelegate:nil];
    self.externalDelegate = (delegate != self) ? delegate : nil;
    [super setDelegate:delegate ? self : nil];
}

- (BOOL)respondsToSelector:(SEL)aSelector {
    id delegate = self.externalDelegate;
    return [super respondsToSelector:aSelector] || [delegate respondsToSelector:aSelector];
}

- (id)forwardingTargetForSelector:(SEL)aSelector {
    id delegate = self.externalDelegate;
    return [delegate respondsToSelector:aSelector] ? delegate : [super forwardingTargetForSelector:aSelector];
}

@end

接下來,我在UIViewController上創建一個類擴展

// UIViewController+Popover.h

#import <UIKit/UIKit.h>

@interface UIViewController (Popover)
- (UIViewController *)popoverPresentingViewController;
@end

還有他們

// UIViewController+Popover.m

#import "UIViewController+Popover.h"
#import "MainSplitViewController.h"

@implementation UIViewController (Popover)

- (UIViewController *)popoverPresentingViewController {
    UIViewController* viewController = self;

    if ([self.splitViewController isKindOfClass:[MainSplitViewController class]]) {
        viewController = self.splitViewController;

        MainSplitViewController* mainSplitViewController = (MainSplitViewController *)self.splitViewController;

        if (mainSplitViewController.primaryColumnController.popoverVisible) {
            [mainSplitViewController.primaryColumnController dismissPopoverAnimated:YES];
        }
    }

    return viewController;
}

@end

現在你在哪里呈現模態,而不是調用[self presentViewController: ... call [self.popoverPresentingViewController presentViewController: ...] 記得導入UIViewController + Popover.h

你的問題最接近我的bug,從modalView返回時,parentView將切換到打開應用程序的方向。
在視覺上看起來模態視圖被旋轉然后返回。

我通過完全刪除模態視圖並使用來解決它

[self.navigationController pushViewController: <the View(not modal now)>]

而不是使用 -

[self presentViewController:<Modal View>]

我認為這是因為導航控制器不擁有模態視圖,因此當從模態視圖返回時它會重新加載到不正確的方向

問題:

以模態方式呈現視圖控制器時,它會在旋轉時被解除。

做法:

  • 設置UISplitViewControllerDelegate
  • 使用UISplitViewControllerDelegate方法
  • 在實例變量中保存對模態視圖控制器的引用
  • 檢查模態視圖控制器的呈現視圖控制器是否存在。
  • 如果它存在,則不需要做任何事情,否則只是在沒有任何動畫的情況下出現。

UISplitViewControllerDelegate方法:

func primaryViewController(forCollapsing splitViewController: UISplitViewController) -> UIViewController? {

    if let someModalViewController = someModalViewController, 
        someModalViewController.presentingViewController == nil {

        let masterViewController = viewControllers.first

        masterViewController?.present(someModalViewController,
                                      animated: false) {

        }
    }

    return nil
}

func primaryViewController(forExpanding splitViewController: UISplitViewController) -> UIViewController? {

    if let someModalViewController = someModalViewController, 
        someModalViewController.presentingViewController == nil {

        let masterViewController = viewControllers.first

        masterViewController?.present(someModalViewController,
                                      animated: false) {

        }
    }

    return nil
}

注意:

  • UISplitViewControllerDelegate有很多方法,最初可能令人生畏,如果你花一些時間進行實驗,你可以實現你想要的。
  • 它具有良好的粒度訪問。

我很遲,但試試這個。 這個對我有用。

[self.splitViewController presentViewController:editView animated:YES completion:nil];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM