【问题标题】:Scroll View Content Width Change During Rotation (Autolayout) - Scroll View wrong size滚动视图内容宽度在旋转期间更改(自动布局) - 滚动视图大小错误
【发布时间】:2013-12-25 23:16:26
【问题描述】:

我有一个滚动视图,里面有一个内容视图。

滚动视图对顶部、底部、前导和尾部内容视图以及顶部、前导、试用超级视图具有约束,底部空间到底部布局。

我在旋转时更改了内容视图的宽度:

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

当我运行应用程序并旋转到横向时,内容视图的宽度发生了变化,一切看起来都很好,但是滚动视图只允许在屏幕的左半部分滚动(整个视图滚动但你的手指必须在屏幕左侧滚动)。滚动视图帧 = (0 0; 320 431);。

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

有什么想法我需要做些什么来通过不选择另一个选项卡并返回来实现这一点?

编辑

我创建了一个名为 ContentViewSubclass 的 Content 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}

一切都在标签栏视图控制器中,它的设置如下:

  1. 查看
    • 滚动视图
      • 内容视图
      • 标签(很多)
      • 文本字段(很多)
      • 表格视图 (2)
      • CollectionViewSubcless (1)

我删除了表格视图和集合视图,以防它们引起问题,但没有帮助。

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

【问题讨论】:

  • 在旋转方法中,除了使内容视图的固有内容大小无效外,什么都不做。此外,请确保您将内容视图固定到滚动视图的内部,就像 Apple 在该技术说明中所做的那样(他们使用视觉格式化语言)。

标签: iphone ios7 scrollview xcode5 autolayout


【解决方案1】:

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

“纯自动布局方法”适用于 Apple 的示例代码,因为图像视图具有固有的内容大小;另一方面,您的内容视图却没有。

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

【讨论】:

  • 谢谢,我会做一些研究。你知道为什么从另一个标签返回该视图时它会像我想要的那样工作吗?
  • 我尝试按照您的建议对内容视图进行子类化,并对我的原始问题进行了编辑。我看起来像你建议的那样做吗?
  • @Gulfer 在 rotate 方法中,除了使内容视图的固有内容大小无效(仅一行代码)之外,什么都不做。
  • 我更改了您的建议并获得了正确的宽度,但是可以启动滚动的视图的唯一部分仍然是屏幕的左半部分。我开始了另一个简单的项目来进行测试。删除标签栏解决了这个问题。现在我正在摆脱标签栏并添加导航按钮。没有它,我的旋转和滚动工作正常。
【解决方案2】:

我也遇到过类似的情况。在我的情况下,它是横向屏幕宽度的最右边部分,当旋转到横向时,它被“添加”到纵向屏幕宽度(即对于 x 的所有值,其中:w-h this simple solution 可能会有所帮助。它为我修好了。

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 2015-12-03
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多