在UIView上旋转/移动物体

时间:2010-10-27 13:24:34

标签: iphone objective-c uiview ios4 rotation

当方向改变时,我需要在UIView上旋转和移动对象。为此,我在willRotateToInterfaceOrientation

中有以下内容
if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
    [self repositionObjectAfterRotation:scrollView x:0 y:100 width:480 height:150];
    [self repositionObjectAfterRotation:pageControl x:50 y:430 width:100 height:30];    
}

我的repositionObjectAfterRotation:x:y:width:height:看起来像这样,它在设置新边界之前获取对象并改变其边界。

- (void)repositionObjectAfterRotation:(UIView *)anObject x:(int)x y:(int)y 
                                     width:(int)width height:(int)height
{   

    [UIView animateWithDuration:kAnimationDuration animations:^{
        CGRect boundsRect = anObject.bounds;
        boundsRect.origin.x = x;
        boundsRect.origin.y = y;
        boundsRect.size.width = width;
        boundsRect.size.height = height;
        anObject.bounds = boundsRect;
    } completion:^ (BOOL finished){
        if (finished) {
            [UIView animateWithDuration:kAnimationDuration animations:^{
                anObject.alpha = 1.0;
            }];
        }
    }];

}

当视图旋转回肖像时,它只显示一半滚动视图,即使我的NSLogs声明框架&界限是正确的......

我是否正确旋转/重新定位对象,还是有更简单/首选的方式来支持景观?

由于

2 个答案:

答案 0 :(得分:0)

旋转到横向时,您明确将高度设置为“150”,但在返回纵向时不要将其调整回来。

我不知道你的自动调整大小是如何在IB中设置的,所以我不能说明这些对象在自己离开时如何调整大小/移动。

答案 1 :(得分:0)

3分:

  1. 你不需要显式开始动画,系统无论如何都会这样做(除非你的动画“与旋转不同。”
  2. 我认为覆盖layoutSubviews会更方便。它在每次轮换后调用,[device orientation]为您提供新的方向。
  3. 您可能希望更改这些视图的frame,而不是bounds,这是一个内部值(即仅在该视图中“内部”)。
  4. frame说'把我放在了上司的这个位置',这就是你想要的。 bound定义了scrollView用于其子视图的坐标。你需要的是框架。

    layoutSubviews中,只需更改框架,您想要的动画将自动应用:

    - (void)layoutSubviews {
        if (UIInterfaceOrientationIsLandscape([[UIDevice currentDevice] orientation])) {
            anObject.frame = landscapeFrame;
        }
        else {
            anObject.frame = portraitFrame;
        }
    }