iPad/iPhone 方向问题
Posted
技术标签:
【中文标题】iPad/iPhone 方向问题【英文标题】:iPad/iPhone orientation issue 【发布时间】:2012-04-16 17:41:21 【问题描述】:我意识到有很多与此问题相关的问题,但是我还没有找到一个可以解决我的问题的问题。
首先,我在 menu.h 中设置了这段代码
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
return YES;
状态栏会随着方向而改变,但视图不会旋转或调整大小。为了尝试缩小我的问题,我决定尝试根据方向在一个 .xib 中切换两个视图
- (void)viewDidLoad
[super viewDidLoad];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
-(void) orientationChanged:(NSNotification *)object
UIDeviceOrientation deviceOrientation = [[object object] orientation];
if (deviceOrientation == UIDeviceOrientationLandscapeLeft || deviceOrientation == UIDeviceOrientationLandscapeRight)
self.view = self.landscapeView;
else
self.view = self.portraitView;
在 ios 模拟器中,视图肯定会更改为特定视图。然而,横向视图显示为纵向和横向。
我在 IB 中的横向视图
更改方向后我在 iOS 模拟器中的横向视图
我在这里做错了什么?我无法弄清楚,任何帮助将不胜感激。先感谢您。 ** 编辑:下面的新代码 ** 好的..我的问题是视图在横向上正确加载,它只是横向的。所以横向视图加载,只是横向。我基于@Seega 修改的代码是:
- (void)viewDidLoad
[super viewDidLoad];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
[[TTNavigator navigator] setCustomTarget:self];
[[TTNavigator navigator] setCustomAction:@selector(photoAction)];
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
if (toInterfaceOrientation == UIDeviceOrientationLandscapeLeft || toInterfaceOrientation == UIDeviceOrientationLandscapeRight)
self.view = self.landscapeView;
else
self.view = self.portraitView;
-(void) orientationChanged:(NSNotification *)object
UIDeviceOrientation deviceOrientation = [[object object] orientation];
if (deviceOrientation == UIDeviceOrientationLandscapeLeft || deviceOrientation == UIDeviceOrientationLandscapeRight)
self.view = self.landscapeView;
else
self.view = self.portraitView;
【问题讨论】:
删除所有[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
的东西和完整的-(void) orientationChanged:(NSNotification *)object
函数。使用 UIInterfaceOrientationLandscapeLeft 和 UIInterfaceOrientationLandscapeRight Additional 只是为了检查函数是否按预期工作 更改 if 语句中的颜色而不是设置另一个 UIView。
我运气不好。我按照解释设置它并在orientationChanged函数中输入断点,它没有被调用。
删除该死的orientationChanged:你不需要它!!!!只需使用- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) self.view = self.landscapeView; else self.view = self.portraitView;
这不起作用。以前,视图至少改变了,现在它不起作用了。
【参考方案1】:
我建议将您的代码放入:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
而不是制作新方法。如果 shouldAutorotateToInterfaceOrientation 方法为该旋转返回 YES,这将被自动调用。
UIDeviceOrientation 和 UIInterfaceOrientation 之间也有区别,因此请确保您引用的是正确的。您现有的代码将更改为以下内容:
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
self.view = self.landscapeView;
else
self.view = self.portraitView;
您还可以使用宏来检查界面方向,从而保持代码更简洁。
if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation))
self.view = self.landscapeView;
else
self.view = self.portraitView;
【讨论】:
我应该使用UIDeviceOrientation
还是UIInterfaceOrientation
?
您应该使用 UIInterfaceOrientation 因为如果您的应用仅在纵向模式下运行(例如)并且用户将他们的设备旋转到横向模式,那么现在该应用仍然看起来像在纵向模式中并且只是被搁置一边,当您检查 UIDeviceOrientation 时,它将处于横向状态,因为设备已旋转,但是当您检查 UIInterfaceOrientation 时,它将读取为纵向,因为应用程序本身没有旋转。这有意义吗?还有更多细节 -> ***.com/questions/6838706/iphone-screen-rotation
这很有道理,谢谢。但是,如何将应用设置为随设备旋转?
好问题。我也想不通
要将应用设置为旋转,您需要 (1) 在应用的“摘要”选项卡下选择“支持的设备方向”(请参阅 Gopal Nair 在此页面上发布的图片)和( 2)您需要返回YES;在 -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 方法中,用于您想要支持该 ViewController 的任何方向(注意:每个视图控制器可以支持不同的设备方向)。【参考方案2】:
您能否确定,您选择了所有方向支持,如下所示。我试过这个,它似乎对我来说工作得很好。
【讨论】:
是的,所有支持的设备方向框都已选中。【参考方案3】:你最好简单地使用
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
self.view = self.landscapeView;
else
self.view = self.portraitView;
处理旋转而不是创建自己的旋转。 现在您可以删除所有通知内容。
【讨论】:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
这是你的想法吗?这对我不起作用。感谢您的帮助
上述代码的问题在于 UIDeviceOrientation 和 UIInterfaceOrientation 是不同的,因此您正在检查 toInterfaceOrientation == a UIDeviceOrientation 并且它们永远不会。这是有关差异的更多信息 - ***.com/questions/6838706/iphone-screen-rotation
这是一个超级简单的错字,不会引起任何警告/错误,所以它甚至更狡猾。
以前没吃过,所以没考虑。但现在有你的问题;)【参考方案4】:
想法!!!
如果您在界面构建器中设置视图,然后切换视图旋转时显示的实际视图,那么您需要在该特定方向构建该视图,而不仅仅是调整其大小以适应方向。
要检查这个:
在 Interface Builder 中打开您的 .xib。 单击对象下的“视图”,以便选择整个视图。 在 IB 右侧的“模拟指标”下查看。确保在“方向”下拉菜单中选择了“横向”。如果您的视图为您想要表示您的横向视图的视图显示“纵向”,则可能是 xcode 正在将您的横向视图旋转为纵向并弄乱您的演示文稿。
如果这有帮助,请告诉我。
【讨论】:
再次感谢您的一贯帮助,非常感谢。纵向视图设置为纵向,横向视图设置为横向。 该死的我以为我有东西。【参考方案5】:嘿,谢谢大家的帮助。我有一个朋友的帮助,我不完全确定问题所在。我可以告诉你我知道他做过的事情。
暂时停用我们的广告
完全删除了第二个视图并使用原生方向和调整大小
几乎每个 .m 文件都添加了这个。
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
return YES;
还以编程方式更改了与此类似的其他一些视图
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
if (interfaceOrientation == UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight)
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
self.Button.frame = CGRectMake(27,96,86,86);
self.Label.frame = CGRectMake(27,162,86,21);
else
self.Button.frame = CGRectMake(18,100,86,86);
self.Label.frame = CGRectMake(18,164,86,21);
抱歉,我无法完全解释答案,我不完全理解项目中包含的影响方向的所有内容。我对 iOS 开发还是很陌生。
【讨论】:
以上是关于iPad/iPhone 方向问题的主要内容,如果未能解决你的问题,请参考以下文章
iPad/iPhone 方向上的 window.scrollTo