设备方向更改时以编程方式重绘视图的简单方法

时间:2015-01-29 19:13:21

标签: ios objective-c uiview uiviewcontroller orientation

我是iOS开发的新手,对于我的任务,我的任务是在设备的方向发生变化时以编程方式更改ViewController。我在这里找到了一个答案的片段,但它没有完成工作。

我尝试将其添加到我的View Controller的viewWillLayoutSubviews,但我得到的是一个未使用的变量警告。

CGRect rotatedFrame = [self.view convertRect:self.view.frame fromView:self.view.superview];

viewWillLayoutSubviews and rotation

作为一个“提示”,我被告知在viewWillLayoutSubviews中实施起来很简单。通过并更改我的VC中的所有CGRects听起来不像是几行代码。必须有一种更简单,更有效的方法来做到这一点,但我只发现在这个网站上挖掘解决方案的片段。谢谢你的阅读。

2 个答案:

答案 0 :(得分:0)

您正在使用的代码行是将CGRect分配给rotateFrame变量,它不会更新视图控制器上的任何内容。

有很多方法可以解决这个问题,但这取决于您的视图中包含的内容以及它的配置方式。例如Auto Layout之类的东西可以让你在Interface Builder中配置几乎所有内容,让你避免在代码中做大部分事情。

您的任务是以编程方式执行此操作,因为我们知道每次旋转设备时都会调用viewWillLayoutSubviews,这是一个很好的起点。这是一种懒惰的方式,我已经开始使用转换来旋转视频以适应新的方向:

//Vertical
CGSize size = self.view.frame.size;
someView.transform = CGAffineTransformMakeRotation((M_PI * (0) / 180.0))
someView.frame = CGRectMake(0, 0, MIN(size.width, size.height), MAX(size.width, size.height));

//Horizontal
CGSize size = [UIScreen mainScreen].bounds.size;
int directionModifier = ([UIDevice currentDevice].orientation == UIInterfaceOrientationLandscapeLeft) ? -1 : 1;
someView.bounds = CGRectMake(0, 0, MAX(size.width, size.height), MIN(size.width, size.height));
someView.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0) *directionModifier);
someView.transform = CGAffineTransformTranslate(someView.transform,0,0);

您的视图中有多少个子视图?他们分组了吗?如果您正在使用自动调整大小的蒙版,则可能只需调整一个或两个视图的帧即可。如果您的根视图有许多子视图,您可以遍历需要进行类似调整的视图,以避免编写多余的代码。这实际上取决于如何设置一切。

答案 1 :(得分:0)

我想出了如何确定viewWidth和viewHeight并将它们设置为CGFloats。然后我添加了一个if-else语句,用于确定显示是纵向还是横向,并相应地设置有问题的calculateButton。

为冗长的代码道歉,但我在搜索此网站时发现我发现"片段"答案,但对iOS来说是新手,很难弄清楚究竟发生了什么。希望以后能帮助别人。 (希望它是正确的)

- (void) viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    CGFloat viewWidth = self.view.bounds.size.width;
    CGFloat viewHeight = self.view.bounds.size.height;
    CGFloat padding = 20;
    CGFloat itemWidth = viewWidth - padding - padding;
    CGFloat itemHeight = 44;

// Bunch of setup code for layout items

    // HOMEWORK: created if-else statement to deal w/ portrait vs. landscape placement of calculateButton.

    if (viewWidth > viewHeight) {
        // portrait
        CGFloat bottomOfLabel = viewHeight;
        self.calculateButton.frame = CGRectMake(padding, bottomOfLabel - itemHeight, itemWidth, itemHeight);
    } else {
        // landscape
        CGFloat bottomOfLabel = CGRectGetMaxY(self.resultLabel.frame);
        self.calculateButton.frame = CGRectMake(padding, bottomOfLabel + padding, itemWidth, itemHeight);
    }
}