2

在此处输入图像描述,我在一个视图中有一个按钮列表,该视图是另一个 UIView 的子视图。当设备方向更改为横向模式时,我需要按顺序重新排列这些按钮。

他们有什么办法吗?或者我需要通过重新定位所有按钮来手动完成所有这些事情?

4

4 回答 4

3

shouldAutorotateToInterfaceOrientation:,在其他答案中提到,是为了让您的视图控制器决定是否允许自动旋转到给定的方向。(你应该返回YESNO)。

如果您真的想以编程方式调整子视图的布局,您可以在任一

- (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动画的。这允许您将任何可动画视图属性更改包装在您自己的动画中,以便它们在旋转期间平滑地动画,而不仅仅是捕捉到它们的新值。

但是,实际上,这通常不是解决问题的最佳方法。有关该问题的更一般性讨论,请参阅此链接

于 2012-07-30T12:37:52.190 回答
1

更改按钮中的 CGFrame

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if(interfaceOrientation==UIInterFaceOrientationPortrait)
    {
        Button1.frame=...;
        Button2.frame=....;
     }
     else if(interfaceOrientation==UIInterFaceOrientationLandscapeLeft)
    {
       Button1.frame=...;
        Button2.frame=....;
    }
    return YES;
}
于 2012-07-30T12:26:03.227 回答
0

1-你可以用这个

YOUR_OBJECT.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | 
            UIViewAutoresizingFlexibleRightMargin;

或者

2-使用带有 CGRectMake 的框架属性为您的对象

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
   if(interfaceOrientation==UIInterFaceOrientationPortrait)
else if(interfaceOrientation==UIInterFaceOrientationLandscapeLeft)
于 2012-07-30T12:34:28.803 回答
0

你可以通过

- (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;
}
于 2012-07-30T13:15:27.493 回答