当设备方向改变时以编程方式重绘视图的简单方法
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);
}
}
我是 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);
}
}