7

我有一个包含几个 UIButtons 的自定义 UITableViewCell。每个按钮的框架位置都与单元格宽度相关。我设置了 autoresizingMask=UIViewAutoresizingFlexibleWidth ,因此当应用程序以横向或纵向模式启动设备时,它将正确调整单元格宽度和按钮位置。

问题是当设备从一种模式旋转到另一种模式时,按钮不会调整位置,因为 UITableViewCell 是可重复使用的。换句话说,单元格没有根据新的 UITalbeView 宽度进行初始化,因为单元格的函数 initWithStyle 在设备旋转之前被调用,并且在设备旋转之后不再被调用。有什么建议么?

4

6 回答 6

13

由于 UITableViewCell 也是一个 UIView,你可以重写 setFrame 方法。每次您的表格视图旋转时,都会为所有单元格调用此方法。

-(void)setFrame:(CGRect)frame
{
    [super setFrame:frame];

    //Do your rotation stuffs here :)
} 
于 2011-06-01T19:34:28.177 回答
7

经过数小时的研究(包括本网站上的帖子),我找不到任何解决方案。但是一个灯泡突然亮了起来。解决方案非常简单。只需检测设备方向是横向还是纵向模式,并为每个定义 ReusableCellIdentifier 并使用不同的名称。

static NSString*Identifier;

if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) {
                Identifier= @"aCell_portrait";
            }
            else Identifier= @"DocumentOptionIdentifier_Landscape";


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];
于 2010-03-19T14:14:42.393 回答
6

以前的答案有一个严重的问题。您应该使用 [UIApplication sharedApplication].statusBarOrientation 而不是 [UIDevice currebtDevice].orientation 因为设备方向与界面方向无关 - 设备方向是基于加速度计的物理旋转。

于 2010-12-19T20:23:27.310 回答
2

勾选的答案就像旧 iOS 版本中的魅力一样。对于 iOS 6.0,我使用了以下代码:

static NSString *Identifier;
if (self.interfaceOrientation==UIInterfaceOrientationPortrait) {
    Identifier=@"aCell_portrait";
}
else {
    Identifier=@"DocumentOptionIdentifier_Landscape";
}

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];
于 2013-03-07T14:17:14.813 回答
1

您需要在您的cellForRowAtIndexPath方法中修复您的单元格框架宽度(假设纵向和横向模式下的高度相同)。这就是这里的工作。我曾经用 IB 创建一个自定义 TableViewCell,它总是初始化为纵向 320 像素宽度。通过定义帧,它按预期工作,即使单元格从队列中“重用”。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 ...
 UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
 if (cell == nil) {
    // create cell here...
 }

 // Adjust cell frame width to be equal to tableview frame width
 cell.frame = CGRectMake(0, 0, tableView.frame.size.width, cell.frame.size.height);
 ...
}
于 2010-12-26T17:54:16.190 回答
0

我有一个类似的问题,这篇文章帮助了我。在我的情况下,我在一个单独的文件中声明了一个自定义类,在这个文件中我有以下代码layoutSubviews

//PORTRAIT CELL
if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && 
    [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight)
{
    //build the custom content views for portrait mode here
}
else
{
    //build the custom content views for landscape mode here
}

然后在我的视图控制器中,我只是实现willAnimateRotationToInterfaceOrientation:并将reloadData消息发送到我的表格视图。

有了这个,我不必触摸cellForRow方法。

于 2012-03-14T00:33:24.527 回答