在 UIView 上旋转/移动对象

Posted

技术标签:

【中文标题】在 UIView 上旋转/移动对象【英文标题】:Rotating/moving objects on a UIView 【发布时间】:2010-10-27 13:24:34 【问题描述】:

当方向改变时,我需要在 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 状态框架和边界是正确的......

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

抱歉,它确实以纵向移动,复制和粘贴错误。我的错。在 IB 中选择了所有的支柱和弹簧。【参考方案2】:

3 分:

    您不需要显式开始动画,系统无论如何都会这样做(除非您的动画“不同于旋转”。 我认为覆盖layoutSubviews 更方便。每次旋转后都会调用它,[device orientation] 会为您提供新的方向。 您可能想要更改这些视图的 frame,而不是它们的 bounds,这是一个内部值(即它只在该视图“内部”重要)。

frame 说'把我放在superivew的这个位置',这就是你想要的。 bound 定义了你的坐标,比如说,scrollView 用于它的子视图。你需要的是框架。

layoutSubviews,只要换帧,你想要的动画就会自动套用:

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

【讨论】:

frame 与超级视图坐标有关,不是吗?覆盖 layoutSubviews 是我以前从未做过的事情。我是否只是覆盖layoutSubviews 并将我的移动代码放在那里?没什么特别的?我想制作动画,因为我的项目不只是旋转,即我有一个滚动视图,旋转时需要从 0,80 到 0,100。 layoutSubviews 在视图旋转时不会被调用...我尝试在willRotateToIntefaceOrientation 中调用[self.view setNeedsLayout]; 但它仍然没有进入我的方法 hmm...我每天都在使用这种方法...在最坏的情况下应该在调用setNeedsLayout 时调用layoutSubviews。我假设您已经检查了 layoutSubviews 在您的视图中是否正确实施?

以上是关于在 UIView 上旋转/移动对象的主要内容,如果未能解决你的问题,请参考以下文章

UIView:旋转+移动

同时旋转和移动 UIView 并设置其中心点

UIview演示仅在一个方向上旋转

Swift + Autolayout:旋转 UILabel,保持在 UIView 旁边

调整旋转 UIView 的子视图大小

使用核心动画和块旋转 UIView 对象的问题