旋转期间滚动视图内容宽度更改(自动安装) - 滚动查看错误的大小

时间:2013-12-08 23:25:59

标签: iphone ios7 scrollview xcode5 autolayout

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

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

我在轮换时更改了内容视图宽度:

-(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. 查看
    • 滚动型
      • 内容查看
      • 标签(很多)
      • Textfields(很多)
      • TableView(2)
      • CollectionViewSubcless(1)
  2. 我删除了表格视图和集合视图,以防它们导致问题但没有帮助。

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

2 个答案:

答案 0 :(得分:1)

您正在使用" Pure AutoLayout Approach" Apple在技术说明中对此进行了描述:https://developer.apple.com/library/ios/technotes/tn2154/_index.html

" Pure AutoLayout Approach"适用于Apple的示例代码,因为图像视图具有内在的内容大小;另一方面,您的内容视图却没有。

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

答案 1 :(得分:0)

我在类似的情况下挣扎。在我的情况下,横向屏幕宽度的最右边部分在旋转到横向时被“添加”到纵向屏幕宽度(即,对于x的所有值,其中:w-h< x< = w)。那些被限制进入那个区域的按钮等都没有响应。如果这听起来与您所看到的相同,那么this simple solution可能有所帮助。它为我修好了。