如何设置不会因设备旋转而扭曲的旋转变换?

时间:2011-09-03 16:27:02

标签: ios ipad uiview

我正在开发一个具有一组UIButton实例的iPad应用程序,我在viewWillAppear:中进行轻微的CGAffineTransform旋转,这样它们就不会在屏幕上完美对齐。但是,当设备向任何方向旋转并且按钮的背景图像变得越来越倾斜时,会出现问题:旋转的越多:

正确:

enter image description here

几次设备轮换后:

enter image description here

以下是我用来为viewDidAppear:上的视图设置动画的代码:

/*
 *  Animate video button
 */

CGPoint videoCenter = self.videoButton.center;

self.videoButton.center = CGPointMake(self.videoButton.center.x + 25.0f, self.videoButton.center.y + 25.0f);

[UIView animateWithDuration:0.5f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                     self.videoButton.center = videoCenter;
                     self.videoButton.transform = CGAffineTransformRotate(CGAffineTransformIdentity, [self convertDegreesToRadians:4.0f]);
                 }
                 completion:^(BOOL finished) {
                     // Do Nothing
                 }];

我已经尝试将变换重置为willRotateToInterfaceOrientation:中我需要的变量,尽管它减少了它发生的程度,但经过多次旋转后它会产生类似的结果。

我尝试将主视图的autoresizesSubviews更改为NO

self.view.autoresizesSubviews = NO;

但是我必须完全手工布置我的横向,我想避免。

如何设置旋转变换,使其不会扭曲设备方向上UIButton的背景图像?

更新

我在viewWillRotateToInterfaceOrientation:中添加了一些日志语句,并注意到按钮的宽度正在增长。这解释了图像失真,但为什么它甚至会发生变化?这对我来说很奇怪:

width       height
-------------------------------
268.574524  149.81514
286.267822  150
304.092621  150
321.91745   150
339.742279  150
357.567078  150
374.401642  150
391.236206  150
409.061066  150
425.895599  150
442.730164  150
459.564728  150
476.399292  150
493.233826  150
509.078125  150
524.922424  150
540.766663  150
556.611023  150

1 个答案:

答案 0 :(得分:0)

您遇到的问题可能是由于UIViewController在界面旋转时完成了自动调整。我的建议是,您要跟踪图像视图的原始框架,并在didRotateFromInterfaceOrientation:中恢复原始框架。因此,在-viewDidLoad中,执行以下操作以保存视图的框架:

videoFrame = self.videoButton.frame;

在此视图控制器的标题中,您还应声明CGRect videoFrame以使上述代码正常工作。现在,我们可以在界面方向完成更改后使用此保存的框架:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)orientation {
    CGPoint oldCenter = [self.videoButton center];
    [self.videoButton setTransform:CGAffineTransformIdentity];
    [self.videoButton setFrame:videoFrame];
    // restore previous center and rotation
    [self.videoButton setCenter:oldCenter];
    [self.videoButton setTransform:CGAffineTransformRotate(CGAffineTransformIdentity, [self convertDegreesToRadians:4.0f])];
}