在此处输入图像描述,我在一个视图中有一个按钮列表,该视图是另一个 UIView 的子视图。当设备方向更改为横向模式时,我需要按顺序重新排列这些按钮。
他们有什么办法吗?或者我需要通过重新定位所有按钮来手动完成所有这些事情?
shouldAutorotateToInterfaceOrientation:
,在其他答案中提到,是为了让您的视图控制器决定是否允许自动旋转到给定的方向。(你应该返回YES
或NO
)。
如果您真的想以编程方式调整子视图的布局,您可以在任一
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[UIView animateWithDuration: duration
delay: 0.0f
options: UIViewAnimationOptionCurveLinear
animations: ^(void) {
if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
self.button.frame = CGRectMake(x1, y1, self.button.frame.size.width, self.button.frame.size.height);
} else {
self.button.frame = CGRectMake(x2, y2, self.button.frame.size.width, self.button.frame.size.height);
}
}
completion: ^(BOOL finished) {
// code to run after animation completes can go here
}];
}
或者,您可以使用willAnimateRotationToInterfaceOrientation:duration:
一步旋转。
它不仅仅在实际发生自动旋转时调用,而且还为您提供duration
动画的。这允许您将任何可动画视图属性更改包装在您自己的动画中,以便它们在旋转期间平滑地动画,而不仅仅是捕捉到它们的新值。
但是,实际上,这通常不是解决问题的最佳方法。有关该问题的更一般性讨论,请参阅此链接
更改按钮中的 CGFrame
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if(interfaceOrientation==UIInterFaceOrientationPortrait)
{
Button1.frame=...;
Button2.frame=....;
}
else if(interfaceOrientation==UIInterFaceOrientationLandscapeLeft)
{
Button1.frame=...;
Button2.frame=....;
}
return YES;
}
1-你可以用这个
YOUR_OBJECT.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin;
或者
2-使用带有 CGRectMake 的框架属性为您的对象
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
if(interfaceOrientation==UIInterFaceOrientationPortrait)
else if(interfaceOrientation==UIInterFaceOrientationLandscapeLeft)
你可以通过
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
方法。
在你的课堂上让两个方法viewController.h
假设它们是 -
-(void)viewForPortraitMode;
-(void)viewForLandscapeMode;
这是您viewcontroller.m
文件中两者的主体部分。
//Set frame according to you
-(void)viewForPortraitMode
{
[btn1 setFrame:CGRectMake(117.0, 383.0, 87.0, 37.0)];
[btn2 setFrame:CGRectMake(40.0, 20.0, 240.0, 324.0)];
}
-(void)viewForLandscapeMode
{
[btn1 setFrame:CGRectMake(200.0, 252, 87.0, 37.0)];
[btn2 setFrame:CGRectMake(20.0, 7.0, 446.0, 228.0)];
}
并在此调用这两个方法
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
{
[self viewForPortraitMode];
}
else
{
[self viewForLandscapeMode];
}
return YES;
}