代码之家  ›  专栏  ›  技术社区  ›  Wayne Lo

旋转自定义的UITableViewCell

  •  7
  • Wayne Lo  · 技术社区  · 14 年前

    我有一个自定义的uiTableViewCell,其中包含几个uiButton。每个按钮的帧位置与单元格宽度相关。我将autoresizingmask=uiviewautoresizingflexiblewidth设置为当应用程序以设备横向或纵向模式启动时,它将正确调整单元格宽度和按钮位置。

    问题是当设备从一种模式旋转到另一种模式时,按钮不会调整位置,因为uiTableViewCell是可重用的。换言之,由于单元的函数initWithStyle在设备旋转之前调用,而在设备旋转之后不再调用,因此单元不会基于新的uitalBeview宽度进行初始化。有什么建议吗?

    6 回复  |  直到 11 年前
        1
  •  13
  •   balboa    13 年前

    由于uiTableViewCell也是uiView,因此可以重写setFrame方法。每当表视图旋转时,将为所有单元格调用此方法。

    -(void)setFrame:(CGRect)frame
    {
        [super setFrame:frame];
    
        //Do your rotation stuffs here :)
    } 
    
        2
  •  7
  •   Wayne Lo    14 年前

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

    static NSString*Identifier;
    
    if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) {
                    Identifier= @"aCell_portrait";
                }
                else Identifier= @"DocumentOptionIdentifier_Landscape";
    
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];
    
        3
  •  6
  •   Hrissan    14 年前

    以前的答案有一个严重的问题。 您应该使用[uiapplication sharedapplication].statusbarorientation而不是[uidevice currebdtdevice].方向,因为设备方向与接口方向无关-设备方向是基于加速度计的物理旋转。

        4
  •  2
  •   user2144580    11 年前

    勾选的答案在旧的iOS版本中很有魅力。对于iOS 6.0,我使用了以下代码:

    static NSString *Identifier;
    if (self.interfaceOrientation==UIInterfaceOrientationPortrait) {
        Identifier=@"aCell_portrait";
    }
    else {
        Identifier=@"DocumentOptionIdentifier_Landscape";
    }
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];
    
        5
  •  1
  •   Mike Bretz    14 年前

    您需要在您的 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);
     ...
    }
    
        6
  •  0
  •   Costique    12 年前

    我也有类似的问题,这篇文章对我有帮助。在我的例子中,我在一个单独的文件中声明了一个自定义类,在这个文件中,我在 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 方法。