1

我有一个视图,其子视图根据约束进行调整(iOS 6 之前,没有自动布局)。我旋转设备,视图按预期动画到它们的新位置和尺寸。

我向我的 XIB 添加了一个新视图。当设备旋转时,此视图将需要以约束无法描述的方式更改位置。是否可以允许除新视图之外的所有视图的默认旋转逻辑?

如果没有(这个问题表明没有)应该如何处理这种情况?

我尝试在旋转的同时添加自己的动画,但这几乎肯定是错误的(帧并不总是在完全相同的位置结束,可能是因为两个动画同时发生)。

// Called on "viewWillAppear"
- (void)adjustLayout
{
    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
    {
        self.myView.frame = CGRectMake(150, 128, 181, 39);
    }
    else
    {
        self.myView.frame = CGRectMake(119, 148, 181, 39);
    }
}

// Called on willRotateToInterfaceOrientation
- (void)adjustLayoutToOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration
{
    // This is not really a good way to override the default animations, but it gets the job done.
    [UIView animateWithDuration:duration animations:^{
        if (UIInterfaceOrientationIsLandscape(orientation))
        {
            NSLog(@"frame: %@", NSStringFromCGRect(self.myView.frame));
            self.myView.frame = CGRectMake(69, 201, 181, 39);
        }
        else
        {
            NSLog(@"frame: %@", NSStringFromCGRect(self.myView.frame));
            self.myView.frame = CGRectMake(258, 94, 181, 39);
        }
    }];
}
4

1 回答 1

1

解决方案是在方法中布局您的自定义视图元素:

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:

在此块期间调用的所有布局更改都将与标准旋转动画一起进行动画处理。

例子:

#import "OSViewController.h"

@implementation OSViewController

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    return YES;
}

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [self layout];
}

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self update];
    [self layout];
}

-(void)update{

}

-(void)layout{

}

@end
于 2013-05-14T19:53:12.543 回答