更改方向时定位UIview

时间:2011-07-08 08:02:04

标签: iphone objective-c uiview uiviewcontroller uiinterfaceorientation

我在InterfaceBuilder的UIViewController中有一个自定义的UIView videoView

当我加载它时,它看起来很好,但是当我把它变成“从肖像画到景观”时,它不会进入坐标所说的位置。然后,当我把它转回来时,它又错了。

我有以下代码:

-(void)viewWillAppear:(BOOL)animated
{
    [self processRotation:self.interfaceOrientation];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}    
-(void)processRotation:(UIInterfaceOrientation)_interfaceOrientation
{
    if (_interfaceOrientation == UIInterfaceOrientationLandscapeLeft || _interfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        videoView.frame = CGRectMake(20.0f, 77.0f, 984.0f, 595.0f);
    }   

else if (_interfaceOrientation == UIInterfaceOrientationPortrait || _interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        videoView.frame = CGRectMake(20.0f, 297.0f, 728.0f, 453.0f);
    }
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [self processRotation:toInterfaceOrientation];
}

2 个答案:

答案 0 :(得分:5)

当视图旋转时,请确保您从纵向移动到横向:

if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation) && UIInterfaceOrientationIsLandscape(interfaceOrientation)

因为方向尚未改变,而不是

videoView.frame = CGRectMake(20.0f, 77.0f, 984.0f, 595.0f);

写:

videoView.frame = CGRectMake(77.0f, 22.0f, 595.0f, 984.0f);

或者,您可以进入Interface Builder并在那里更改自动调整遮罩,并且不会在代码中执行任何操作。要更改自动调整遮罩,请转到右窗格中的“大小”检查器(标尺图标)。你会看到一个内部有一个垂直和水平箭头的正方形,并且每边都有一个字母I形状的线条。当红色(打开,单击以打开)时,内部的箭头将使视图调整大小时对象在该方向上自动伸展。打开I形线基本上将视图停靠到那一侧,这意味着视图侧面与该侧面之间的距离将始终保持不变。 例如如果顶部的工具栏在横向上变薄,请选择顶行,否则您的视图将离顶部工具栏最远几英里。

或者你可以为自动旋转返回no并通过调用

自行实现
self.interfaceOrientation = toInterfaceOrientation;

然后手动更改原始代码中的坐标。

你真的需要尝试一下,我一直遇到这个问题,每次都会以不同的方式修复它。

答案 1 :(得分:0)

您正在使用willRotateToInterfaceOrientation:,它在轮换发生之前被调用。如果videoView设置了autoresizingMask,那么自动调整功能将在稍后启动并更改视图的位置。

您通常应该在- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration中执行此操作并确保将您的videoView的autoresizingMask设置为UIViewAutoresizingNone