UITableView在设备方向更改时不会正确更改其大小

时间:2011-12-01 09:21:30

标签: iphone ios uitableview device-orientation

这可能听起来像是一个新手问题,但我是iOS开发新手,

我的iPad视图上有UIWebView和UITableView。 在shouldAutorotateToInterfaceOrientation我调整了它们的大小,看起来很漂亮。

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {    
        if( interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
            CGRect f = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2);
            self.mTextView.frame = f;
            f = CGRectMake(0, self.view.frame.size.height / 2, self.view.frame.size.width, self.view.frame.size.height / 2);
            self.mTableView.frame = f;
        }
        if( interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {     
            CGRect f = CGRectMake(0, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
            self.mTextView.frame = f;
            f = CGRectMake(self.view.frame.size.width / 2, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
            self.mTableView.frame = f;        
        }   
        return YES;
    }

现在的问题是: 对于第一次加载,表视图以正确的大小绘制,但是当我切换到纵向模式然后返回横向模式时,UITableView变得比帧指定的更宽。那么为什么会发生这种情况以及如何解决这个问题呢?

PS。我也尝试过为同一方法设置所有单元格的帧没有帮助。

PSS。这只发生在设备上,在模拟器上UITableView正确显示

6 个答案:

答案 0 :(得分:4)

shouldAutorotateToInterfaceOrientation:仅返回一个布尔值,指示视图控制器是否支持指定的方向,您不应在此方法中进行任何UI转换,而是在willAnimateRotationToInterfaceOrientation:duration:中执行所有操作。

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

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{    
    if( interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
        CGRect f = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2);
        self.mTextView.frame = f;
        f = CGRectMake(0, self.view.frame.size.height / 2, self.view.frame.size.width, self.view.frame.size.height / 2);
        self.mTableView.frame = f;
    }
    if( interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {     
        CGRect f = CGRectMake(0, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
        self.mTextView.frame = f;
        f = CGRectMake(self.view.frame.size.width / 2, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
        self.mTableView.frame = f;        
    }
}

Have a look at the documentation for UIViewController,很好地解释了。

答案 1 :(得分:2)

iOS只调用一次此功能!为了使您的工作顺利进行,您必须将此行添加到(void)viewDidLoad函数中:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];

使(void)orientationChanged:(id)object功能:

- (void)orientationChanged:(id)object{
    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication] statusBarOrientation;

    if(UIInterfaceOrientationIsPortrait(interfaceOrientation)){
        // some works
    }else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)){
        // another works
    }
}

我希望它对你有用!

答案 2 :(得分:2)

您可以在纵向和横向模式下更改UITableView的大小。 UITableView以相对于先前方向模式的比率自动更改大小。因此,您可以为两种模式修复所需的大小。

希望这对你有用。

答案 3 :(得分:0)

请检查视图的autoResizing属性。

答案 4 :(得分:0)

最简单的方法是您可以为纵向和横向模式创建2个不同的视图,因此无论何时模式更改,您都可以轻松更改视图。 像这样:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
        self.view = self.portraitView;
    else 
        self.view = self.landscapeView;
    [tblScore reloadData];
    return YES;
}

答案 5 :(得分:0)