在设备方向变化的UiView中心UIActivityIndi​​catorView

问题描述:

我已经阅读了几乎所有与这个主题相关的东西,但从字面上看,没有任何工作。在设备方向变化的UiView中心UIActivityIndi​​catorView

_spinnerContainer出现,_spinner被显示在它的中间,但是当设备旋转时,旋转_spinnerContainer如预期并在旧_spinnerContainer的位置的中间_spinner冻结。

我相信它应该是一些非常微不足道的东西。

任何帮助?

谢谢!

_spinnerContainer = [[UIView alloc] initWithFrame:self.rectForView]; 
_spinnerContainer.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.35]; 
_spinnerContainer.autoresizesSubviews = NO; 
_spinnerContainer.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
_spinnerContainer.clearsContextBeforeDrawing = YES; 
_spinnerContainer.clipsToBounds = NO; 
_spinnerContainer.contentMode = UIViewContentModeCenter; 

_spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
_spinner.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin; 
_spinner.center = _spinnerContainer.center; 
[_spinner startAnimating]; 
[_spinnerContainer addSubview:_spinner]; 
+0

如何'_spinnerContainer'曾经进入界面?没有更多上下文,你的代码就没有意义。 – matt

只要删除这个:

_spinnerContainer.autoresizesSubviews = NO; 
+0

非常感谢!你完全赞同这一点! 我就像一只熊:2x2 = 5,我几乎砸了我的头=) –

您似乎认为,这样的代码:

_spinner.center = _spinnerContainer.center; 

...是指“把微调的微调容器的中心”。它没有。这是没有意义的,其实,因为_spinnerContainer.center是位置某处微调容器的上海华,并在上海华的坐标系 - 而_spinner.center需要被相对定位上海华盈,即相对于微调容器本身内部的坐标系(也称为bounds)。

所以,虽然你说“当_spinnerContainer出现,_spinner显示在它的中间,”实际上这或多或少是巧合。您的代码甚至不会正确构建接口的初始接口,所以旋转后它不起作用也就不足为奇了。

以我个人的观点来看,这里最简单的解决方案是抛开代码并使用自动布局约束来定位这些视图。自动布局具有的优点是,它可以准确描述不管轮换应该发生什么。

+0

谢谢@matt。你的解释非常有趣 - 我不是iOS开发人员。决定从德米特里的解决方案开始,它就像一个魅力=) –

+0

优秀!但是,你仍然不应该将视角的中心设置在其超视图的中心,这似乎只在非常罕见的情况下才起作用(并且你偶然发现了一个)。在我看来,学习自动布局和做你约束的事情要简单得多,即使它看起来更多代码开始。 – matt