让UIView旋转它的viewController方向

时间:2014-09-03 02:30:49

标签: ios objective-c uiviewcontroller

修改:我已更新问题和标题。似乎问题是在我自己的init中添加的UIView实际上并没有做除旋转之外的任何事情。我是否真的必须为UIView处理旋转?我试了[self.overlay addConstraints:[self.view constraints]];没有运气。我意识到这可以通过[self.overlay setFrame:self.view.frame];内的viewDidAppear来修复,但我宁愿永远不要在该方法中执行任何

到目前为止,我一直使用Storyboard来设计我的视图控制器。这次,我只是编写几行代码来显示视图,但似乎控制器init中创建的视图不会考虑我的方向。使用Storyboard并按名称等实例化ViewController,它可以工作。现在,我自己实例化,使用自定义init方法,我认为这是问题所在。我的自定义ViewController只有这个init方法和一些旋转委托:

-(id)initWithURL:(NSURL*)url
{
    self = [super init];
    if(self)
    {
        self.overlay = [[UIView alloc] initWithFrame: self.view.frame];
        self.overlay.backgroundColor = [UIColor grayColor];
        [self.view addSubview:self.overlay];
        self.url = url;
    }
    return self;
}

/* viewDidLoad etc.. */

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
-(BOOL)shouldAutorotate
{
    return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeLeft;
}

为了以模态方式显示,我在当前显示的控制器中使用它:

CustomViewController *cvc = [[CustomViewController alloc] initWithURL: url];
[cvc setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self presentViewController:cvc animated:YES completion:nil];

(或任何其他transitionStyle)

结果如下图所示: Wrongly displayed landscape 灰色区域是CustomViewController中的新UIView,它在init中创建。黑色区域为self.view,并且对齐正确。如果我允许纵向和旋转,它会在纵向上完美对齐,但从不在横向上对齐。在所呈现的模态customViewController中似乎self.overlay将无法正确旋转。 我是否通过替换任何init方法或其他内容来覆盖某些规则?通过故事板执行此操作时,它会在横向上正确显示。

1 个答案:

答案 0 :(得分:0)

在这里回答我自己的问题。事实证明,添加的UIView确实是旋转的,但没有改变它的宽度和高度在横向,因此比屏幕更高,而且太薄。设置autoresizeMask修复了我的问题:

overlay = [[UIView alloc] initWithFrame:self.view.bounds];
[overlay setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth];