方向更改时的UIScrollview内容大小

时间:2012-11-17 12:06:59

标签: objective-c ios uiscrollview uiinterfaceorientation contentsize

我有一个带分页的滚动视图。在viewDidLoad中,我检查当前方向是否为横向,然后我设置其内容大小的高度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)];


    }

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

但是当方向改变时,

我必须再次设置scrollview的框架和内容,我将其设置为

-(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,这也不够。并且它增加了另一个问题,即scrollview开始对角线滚动,我不想要,因为它看起来很奇怪。任何人都可以帮我理解我错过的地方和地点吗?

我已将scrollview的自动调整模板设置为

[scroll setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleHeight];

但改变它没有帮助。

2 个答案:

答案 0 :(得分:5)

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

  2. Yes

  3. 返回shouldAutorotateToInterfaceOrientation
  4. 每次旋转设备时都会调用willRotateToInterfaceOrientation: duration:

  5. 像这样实现这个方法。

    -(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

答案 1 :(得分: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);

您需要设置内容大小,具体取决于您在滚动视图中的内容