【问题标题】:Rotating iPhone and changing views旋转 iPhone 和改变视图
【发布时间】:2011-01-25 16:29:05
【问题描述】:

我从来没有玩过 iPhone 是横向的,但我有一个功能齐全的 iPhone 应用程序,它假设用户正在直立查看 iPhone。我想玩转手机,为了做到这一点,我做了一些非常简单的事情:

我将以下代码添加到我的视图控制器中:

-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {
    NSLog(@"WILL ROTATE TO INTERFACE ORIENTATION: %@",orientation);

    if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight))
        tableView.frame = CGRectMake(0, 0, 480, 320);
    else
        tableView.frame = CGRectMake(0,73,320,390);


}

我收到 BAD_ACCESS 错误。我根本看不到视图负载。那么,问题出在哪里,如何正确实现 willRotate 方法,以便在手机旋转时,我可以调整所有组件的大小?

【问题讨论】:

  • 这不是太多的代码。 EXC_BAD_ACCESS 是由于访问不再存在的对象而导致的错误。你的控制台里有什么?它究竟是什么时候发生的?

标签: iphone ios uiview uiviewcontroller rotation


【解决方案1】:

崩溃是由这一行引起的:

NSLog(@"WILL ROTATE TO INTERFACE ORIENTATION: %@",orientation);

orientation 是一个enum 值,因此格式说明符应该是%i 而不是%@

支持旋转的最简单方法是实现:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

返回 YES 以获取您希望支持的方向。不要在此方法中进行任何调整大小。使用视图支柱和弹簧确保它们为交替旋转正确调整大小和重新定位。

【讨论】:

  • 从 iOS 6 开始,shouldAutorotateToInterfaceOrientation: 已弃用;现在使用shouldAutorotate:bit.ly/1iu7EOn
【解决方案2】:

这是您的日志记录代码的问题:

NSLog(@"WILL ROTATE TO INTERFACE ORIENTATION: %@",orientation);

日志字符串中的格式说明符%@NSString 指针的占位符。当应用程序到达这一点时,它会查看方向变量,尝试取消引用它以获取 NSString 实例,然后崩溃,因为它根本不是指针,而是枚举值。

【讨论】:

  • %@ 不仅仅是NSString 的占位符。它适用于任何NSObject 甚至CFTypeRefs。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多