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

Simple way to redraw view programatically when device orientation changes

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

我尝试将其添加到我的视图控制器的 viewWillLayoutSubviews,但我得到的只是一个未使用的变量警告。

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

viewWillLayoutSubviews and rotation

作为 "hint",有人告诉我在 viewWillLayoutSubviews 中实施起来很简单。遍历并更改我的 VC 中的所有 CGRects 听起来不像是几行代码。必须有一种更简单、更有效的方法来做到这一点,但我只在这个网站上找到了解决方案的片段。感谢阅读。

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

有很多方法可以解决这个问题,但这取决于您的视图中包含的内容以及它的配置方式。例如 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);

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

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

对于冗长的代码深表歉意,但我在搜索该网站时发现了 "snippets" 个答案,但作为 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);
    }
}