方向更改时的 UIScrollview 内容大小

Posted

技术标签:

【中文标题】方向更改时的 UIScrollview 内容大小【英文标题】:UIScrollview content size when orientation changes 【发布时间】:2012-11-17 12:06:59 【问题描述】:

我有一个带有分页的滚动视图。在 viewDidLoad 我检查当前方向是否为横向,然后我将其 contentsize 的高度设置为 440

 if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) 
    
        [scroll      setContentSize:CGSizeMake(self.scroll.frame.size.width*numberOfPages,340)];


    
    else if (UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))

    
        [scroll setFrame:CGRectMake(0,0,480,480)];
        [scroll setContentSize:CGSizeMake(self.scroll.frame.size.width*numberOfPages, 440)];


    

一切正常滚动视图滚动流畅,没有对角滚动。

但是当方向改变时,

我必须再次设置滚动视图的框架和内容大小,我将其设置如下

-(void)orientationChanged:(id)object

if(UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]))

    self.scroll.frame = [[UIScreen mainScreen]bounds];

    [scroll setContentSize:CGSizeMake(self.scroll.frame.size.width*numberOfPages, 340)];



else

 self.scroll.frame = CGRectMake(0,0,480,480);
        [scroll setContentSize:CGSizeMake(self.scroll.frame.size.width*numberOfPages, 600)];




我不明白为什么我必须在横向模式下将内容大小的高度设置为 600,这还不够。它又增加了一个问题,即滚动视图开始对角滚动,这是我不想要的,因为它看起来很奇怪。谁能帮助我了解我在哪里以及缺少什么?

我已将滚动视图的自动调整大小掩码设置为

[scroll setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleHeight];

但改变它没有帮助。

【问题讨论】:

我只想停止滚动视图的对角滚动问题,我不关心其他问题,我不关心是否必须将内容大小高度设置为 1000。但我想了解其背后的原因。仅当视图已存在时将其方向更改为横向时,才会发生对角滚动。仅在横向模式下第一次出现视图时不会发生这种情况。 我认为你不需要在每次方向改变时都改变 contentsize。您只需要更改帧大小。即使您使用 autoresizing ,也不需要这样做。 [scroll setAutoresizingMask:UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];试试这样 我必须按照我所说的设置其内容大小视图的框架。我不能给滚动视图灵活的宽度,因为我有分页,给灵活的宽度会导致页面相互重叠,因为当你给灵活的宽度时,滚动视图会在两侧伸展。这就是为什么我在每次方向改变时都设置滚动视图的框架 【参考方案1】:

    不要使用UIDeviceOrientation。请改用UIInterfaceOrientationDeviceOrientation 有两个您不需要的额外选项。 (UIDeviceOrientationFaceUpUIDeviceOrientationFaceDown

    shouldAutorotateToInterfaceOrientation返回Yes

    现在每次旋转设备时都会调用willRotateToInterfaceOrientation: duration:

    像这样实现这个方法。

    -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    
    CGRect frame;
    int pageNumber = 2;
    int statusBarHeight = 20;
    
    if ((toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)) 
        frame = CGRectMake(0, 0, 480, 320 - statusBarHeight);
     else 
        frame = CGRectMake(0, 0, 320, 480 - statusBarHeight);
    
    
    scrollView.frame = frame;
    scrollView.contentSize = CGSizeMake(frame.size.width * 2, frame.size.height);
     
    

    让,

    pageNumber = 2

    statusBarHeight = 20

【讨论】:

您在第 2 步中提到的 shouldAutorotateToInterfaceOrientation 在哪里? @Josh shouldAutorotateToInterfaceOrientation 现在已弃用。这是一个UIViewController's 方法。请改用shouldAutorotatesupportedInterfaceOrientations【参考方案2】:

这是您的代码中的问题。为什么要这样设置帧大小?您只有320px width 的屏幕尺寸。而当它变为landscape 时,高度将只有320px。但是您将滚动 height 设置为 480pxgoes out of the screenstart to scroll diagonally

self.scroll.frame = CGRectMake(0,0,480,480);

不是那个帧大小,而是像这样改变

self.scroll.frame = CGRectMake(0,0,480,320);

您需要设置内容大小,具体取决于您在任一方向的滚动视图中所拥有的内容

【讨论】:

感谢您的回答,但我通过使父滚动视图垂直滚动并添加需要水平滚动的滚动视图作为 parentScroll 的子视图解决了我的问题。它现在工作正常,但我认为你的回答也可以解决问题。

以上是关于方向更改时的 UIScrollview 内容大小的主要内容,如果未能解决你的问题,请参考以下文章

更改 UIScrollView 内容大小

IOS 中方向更改后包含 UIImageView 的 UIScrollView 的布局不正确

UIScrollView 不使用自动布局滚动(内容视图框架大小以编程方式更改)

iOS - 更改 UIScrollView 的大小后 ContentOffset 保持不变

向 UIScrollview 添加/删除 UIView 时的滞后来源?

了解使用 UIPopoverController 时的 UIScrollView 大小行为