在shouldAutorotate之后以编程方式旋转UI元素

时间:2014-05-20 16:00:41

标签: objective-c xcode uiview uiviewcontroller autorotate

我有viewController不应该自动旋转",而是手动旋转特定的GUI元素。原因是我使用前置摄像头拍照,并且我不希望旋转包含UIView的{​​{1}}。 我的代码如下所示:

UIImageView

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    [self performSelector:@selector(refreshView) withObject:nil afterDelay:1.0];
    return NO; // don't autorotate!
}

" labelPrize"标题是标题" 20 EURO"这可以在下面的屏幕截图中找到," prizeView"是它的容器。 prizeView是唯一具有约束定义的GUI元素,如下所示:

Properties of prizeView

只是为了澄清,这里有" labelPrize" 的样子:

Properties of labelPrize

最后,这是应用程序产生的内容:

enter image description here

这不是我想达到的目标,我喜欢" prizeView" /" labelPrize"是

  • 始终与地平线对齐
  • 始终位于屏幕的正中央

另外值得一提的是:我想在上面添加标签(标题)和下面的按钮("好的")我的" labelPrize"并在- (void) refreshView { UIDeviceOrientation actualDeviceOrientation = [[UIDevice currentDevice] orientation]; float rotation = 0; // UIDeviceOrientationPortrait if (actualDeviceOrientation == UIDeviceOrientationPortraitUpsideDown) rotation = 180; else if (actualDeviceOrientation == UIDeviceOrientationLandscapeLeft) rotation = 90; else if (actualDeviceOrientation == UIDeviceOrientationLandscapeRight) rotation = 270; float rotationRadians = rotation * M_PI / 180; [UIView animateWithDuration:0.4 animations:^(void) { self.labelPrize.center = self.prizeView.center; self.prizeView.transform = CGAffineTransformMakeRotation(rotationRadians); } completion:^(BOOL finished){ }]; } 中旋转/定位它们。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这里有两个大问题。我们一次拿一个。

<强>(1)

self.labelPrize.center = self.prizeView.center;

想一想。 labelPrizeprizeView的子视图。因此,就坐标系统而言,您正在将苹果与橙子混合:labelPrize.center是根据prizeView.bounds来衡量的,但prizeView.center是相对于self.view.bounds来衡量的。要将labelPrize的中心保持在prizeView的中心,请将其置于prizeView边界的中点。 (但是,您根本不必移动它,因为变换会转换边界。)

<强>(2)

旋转视图变换和自动布局是致命的敌人,正如我解释here。这就是为什么旋转prizeView的变换似乎也改变了它的位置。我的答案为您提供了几种可能的解决方法。