iPhone旋转后UIScrollView中的contentOffset

时间:2010-11-20 12:55:48

标签: uiscrollview uiimageview

UIImageView中有一个UIScrollViewcontentOffset属性有问题。根据Apple的参考,这被定义为:

contentOffset :内容视图的原点偏离滚动视图原点的点。

例如,如果图像位于屏幕的左上角,如下所示,则contentOffset将为(0,0):

   _________
   |IMG    |
   |IMG    |
   |       |
   |       |
   |       |
   |       |
   ---------

对于设备旋转,我有以下设置:

 scrollView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |
       UIViewAutoresizingFlexibleHeight);

 imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |
       UIViewAutoresizingFlexibleHeight);

 imageView.contentMode = UIViewContentModeCenter;  
    scrollView.contentMode = UIViewContentModeCenter;

这将使一切都围绕屏幕中心旋转。 旋转屏幕后,屏幕将如下所示:

    ______________
    |       IMG  |
    |       IMG  |
    |            |
    --------------

我的问题是,如果我现在读到contentOffset,它仍然是(0,0)。 (如果我在横向模式下移动UIImage,contentOffset的值会更新,但会根据错误的原点进行计算。)

有没有办法计算UIImage相对于屏幕左上角的坐标。当屏幕处于视图的初始方向时,contentOffset似乎只返回此值。

我试过阅读self.view.transformscrollView.transform,但它们始终是身份。

1 个答案:

答案 0 :(得分:3)

以下是一种方法:滚动视图集

scrollView.autoresizingMask =(UIViewAutoresizingFlexibleWidth 
                                     | UIViewAutoresizingFlexibleHeight);

scrollView.contentMode = UIViewContentModeTopRight;

即使旋转行为不正确,UIViewContentModeTopRight模式也会将左上角保持在坐标(0,0)。要获得与UIViewContentModeCenter相同的旋转行为,请添加

    scrollView.contentOffset = fix(sv.contentOffset, currentOrientation, goalOrientation);

进入willAnimateRotationToInterfaceOrientationfix是函数

CGPoint fix(CGPoint offset, UIInterfaceOrientation currentOrientation, UIInterfaceOrientation goalOrientation) {

CGFloat xx = offset.x;
CGFloat yy = offset.y;

CGPoint result;

if (UIInterfaceOrientationIsLandscape(currentOrientation)) {

    if (UIInterfaceOrientationIsLandscape(goalOrientation)) {
        // landscape -> landscape
        result = CGPointMake(xx, yy);
    } else {
        // landscape -> portrait
        result = CGPointMake(xx+80, yy-80);
    }
} else {
    if (UIInterfaceOrientationIsLandscape(goalOrientation)) {
        // portrait -> landscape
        result = CGPointMake(xx-80, yy+80);
    } else {
        // portrait -> portrait
        result = CGPointMake(xx, yy);
    }
}
return result;
}

上面的代码将使滚动视图围绕屏幕中心旋转,并确保左上方的corder始终是坐标(0,0)。