gpt4 book ai didi

ios - 方向改变时交换 UIViewControllers 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:40:55 25 4
gpt4 key购买 nike

我有一个带有 2 个 View Controller 的单 View 应用程序,用于呈现不同的纵向和横向布局。我已经设置了方向更改通知,并且可以在第一次方向更改时成功显示横向 View 。

第一个问题:当我将方向改回纵向时,不会显示纵向 View 。

第二个问题:当我将方向改回横向时,横向 View 显示,但我收到警告:

尝试在其 View 不在窗口层次结构中的 CalculatorViewController 上显示 CalculatorViewControllerLandscape。

我浏览了 apple 文档和几篇有类似问题的帖子,发现答案在于使用委托(delegate),但我无法正确设置委托(delegate)。这是我的尝试:

CalculatorViewControllerLandscape.h

@protocol SecondControllerDelegate <NSObject>

@end
.....
@property(nonatomic, weak) id <SecondControllerDelegate> delegate;

CalculatorViewController.h

@interface CalculatorViewController : UIViewController <SecondControllerDelegate> {
....
}
@property (strong) CalculatorViewControllerLandscape *landscapeVC;

CalculatorViewCalculator.m

- (void)awakeFromNib
{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
// register as a delegate
self.navigationController.delegate = (id)self;
}

- (void)orientationChanged:(NSNotification *)notification
{
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
!isShowingLandscapeView)
{
NSLog(@"Orientation has changed to landscape");
// code here to show landscape storyboard
UIStoryboard *landscapeStoryboard = [UIStoryboard storyboardWithName:@"LandscapeStoryboard" bundle:nil];
UIViewController *landscapeViewController = [landscapeStoryboard instantiateInitialViewController];
[self presentViewController:landscapeViewController animated:YES completion:nil];
isShowingLandscapeView = YES;
}
else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
isShowingLandscapeView)
{
NSLog(@"Orientation has changed to portrait");
[[self presentingViewController] dismissViewControllerAnimated:NO completion:nil];
isShowingLandscapeView = NO;
}
}

我已经为此工作了几个小时,并检查了所有有类似问题的帖子,但我仍然无法弄清楚。在此先感谢您的帮助。

最佳答案

最佳做法是在单个 UIViewController 中处理旋转事件,而不是使用两个单独的。我不熟悉界面生成器,但您可以通过编程方式覆盖 -(void)viewWillLayoutSubviews; 并根据 self.interfaceOrientation 适本地布置您的 View 。我建议您这样做。

但是,在回答您的问题时:

尝试改变

[[self presentingViewController] dismissViewControllerAnimated:NO completion:nil];

[self dismissViewControllerAnimated:NO completion:nil];

这也可能解决第二个问题,因为旧的横向 View Controller 没有被正确关闭。

关于ios - 方向改变时交换 UIViewControllers 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18501423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com