iphone - ScrollView 内容宽度在旋转期间发生变化(自动布局) - ScrollView 尺寸错误

标签 iphone ios7 scrollview xcode5 autolayout

我有一个 ScrollView ,其中有一个内容 View 。

ScrollView 对顶部、底部、前导和尾随内容 View 以及顶部、前导、试验 super View 以及底部布局的底部空间有约束。

我更改旋转时的内容 View 宽度:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation      duration:(NSTimeInterval)duration{
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
{
    _contentWidth.constant = 480; 
}else{
    //iPhone Portrait
    _contentWidth.constant = 320;
    }
}

当我运行应用程序并旋转到横向时,内容 View 的宽度发生变化,一切看起来都不错,但 ScrollView 只允许在屏幕的左半部分滚动(整个 View 滚动,但您的手指必须放在屏幕左侧滚动)。 ScrollView 框架 = (0 0; 320 431);。

如果我转到选项卡栏上的另一个选项卡并返回到此 View ,则框架 = (0 0; 480 320);它应该是什么,一切正常/看起来都很好。

我需要做什么才能通过不选择另一个选项卡并返回来实现此目的,有什么想法吗?

编辑

我创建了一个名为 ContentViewSubclass 的内容 View 子类,并在其中添加了以下方法:

-(CGSize)intrinsicContentSize{
CGSize size;
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
{
    size.height = 1000;
    size.width = 480;
    return size;
  }else{
    //iPhone Portrait
    size.height = 1000;
    size.width = 320;
    return size;
  }
}

然后在我的 ViewController.m 上更新为以下代码:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
[_contentView invalidateIntrinsicContentSize];
[_contentView intrinsicContentSize];
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
{   _contentWidth.constant = 480;
    _contentHeight.constant = 1000;
}else{
    //iPhone Portrait
    _contentWidth.constant = 320;
    _contentHeight.constant = 1000;
  }
}

当我记录我得到的尺寸时

景观: ContentViewSubclass框架是(0 0, 480 1000) UIScrollView 框架是 (0 20, 480 251) contentView 固有大小为 {480, 1000}

肖像: ContentViewSubclass框架是(0 0; 320 1000) UIScrollView 框架是 (0 20, 320 411) contentView 固有大小为 {320, 1000}

所有内容都在选项卡栏 View Controller 中,其设置如下:

  1. 查看
    • ScrollView
      • 内容 View
      • 标签(很多)
      • 文本字段(很多)
      • 表格 View (2)
      • CollectionViewSubcless (1)

我删除了 TableView 和 Collection View ,以防它们引起问题,但这没有帮助。

同样的问题。我在所有内容上都获得了正确的布局,并且所有内容都滚动,但您必须在横向触摸屏幕的左半部分才能滚动它。如果我转到另一个选项卡 View 并返回到这个选项卡 View ,它就会正常工作。然后 ScrollView 显示 UIScrollView 框架为 (0 20, 480 300)。

最佳答案

您正在使用 Apple 在技术说明中描述的“纯自动布局方法”:https://developer.apple.com/library/ios/technotes/tn2154/_index.html

“纯自动布局方法”适用于 Apple 的示例代码,因为 ImageView 具有固有的内容大小;另一方面,您的内容 View 则不然。

如果您不想切换到“混合方法”,那么您的内容 View 必须具有固有的内容大小。您可以通过创建一个 UIView 子类并重写 intrinsicContentSize 方法来实现这一点。在 willRotateToInterface... 方法中,将 invalidateIntrinsicContentSize 发送到您的内容 View 。

关于iphone - ScrollView 内容宽度在旋转期间发生变化(自动布局) - ScrollView 尺寸错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20460584/

相关文章:

iphone - 触摸索引时显示 UITableView 的部分标题

iphone - iPhone 上的推送通知与拉取通知

iphone - 我的 iPhone Simulator 3.0 地址簿是空的!

animation - iOS 7 启动图像(启动画面)淡出

swift - 向上或向下滚动时增加或减少 imageView 的高度

iphone - iPhone应用程序如何与其他设备通信?

javascript - IOS7 innerWidth & Co. 疯了吗?

ios - IOS7 更新后 OpenGL Alpha 混合错误

ios - 多个 ScrollView 彼此内部

java - Android ScrollView 添加新行