【问题标题】:Misaligned tableview cells in a rotated UITableView旋转的 UITableView 中未对齐的 tableview 单元格
【发布时间】:2012-02-14 15:38:50
【问题描述】:

作为一个小背景,我正在构建一个旋转的 UITableView 作为一种横向“选择器”视图。为此,我采用 UITableView,对其应用旋转变换,然后再次旋转 tableview 内的 UITableViewCells。

我遇到的问题是一些表格单元格变得“未对齐” - 它们的框架被绘制在与其他表格单元格有一定距离的偏移量(在 x 和 y 维度上)。

我已经缩小范围,在进行[tableView reloadData] 调用后,此错误发生在完全超出可见表格视图矩形的第一个表格单元格上。 (即,如果我有 4 个表格单元格,A 是完全可见和绘制的,B 是视图的一半/一半,而 C 和 D 完全不在屏幕上且尚未渲染,当我滚动到 C 时,它是窃听,但是当我滚动到 D 时,它不是)。

现在是一些代码 -

包含视图的初始化

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        ...
        self.tableView = [[UITableView alloc] init];
        [self addSubview:_tableView];
        [_tableView setDelegate:self];
        [_tableView setShowsVerticalScrollIndicator:NO];
        [_tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
        CGAffineTransform transform = CGAffineTransformMakeRotation(-1.5707963);    
        _tableView.transform = transform;
        _tableView.frame = self.bounds;
        ...
    }
    return self;
}

相关的委托方法

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return [tableView.dataSource tableView:tableView cellForRowAtIndexPath:indexPath].frame.size.height;
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    CGAffineTransform transform = CGAffineTransformMakeRotation(1.5707963);
    cell.transform = transform;
}

表格单元格的layoutSubviews
编辑:我根据单元格内容的长度手动设置单元格的大小(主要是宽度)

- (void)layoutSubviews {
    [super layoutSubviews];

    // some calculations and sizing of subviews

    // height and width are swapped here, because the table cell will be rotated.
    self.frame = (CGRect){self.frame.origin.x,self.frame.origin.y,calculatedHeight,calculatedWidth};
}

似乎有问题的表格单元的frame.origin 在到达布局子视图时设置不正确。将框架的origin.x 值设置为 0 可以解决 x 尺寸偏移问题,但显然我不能对 y 尺寸做同样的事情,因为这个值决定了单元格在 tableview 中的位置。

如果有一些我可能遗漏的重要信息,请告诉我。谢谢!

【问题讨论】:

    标签: iphone ios uitableview cgaffinetransform


    【解决方案1】:

    您是否尝试设置单元格图层的锚点,即图层旋转(变换)的点。它默认为 .5, .5 是图层的中心,它可能需要设置为 0, 0(或 1, 1 - 我不记得图层坐标是否从我的头顶反转)

    或者尝试在应用转换后立即在 willDisplayCell 中设置框架,而不是在布局子视图中进行

    【讨论】:

    • 嗯,好主意。我会试试这个 - 唯一的问题是所有其他单元格都被完美渲染,所以我不知道如果这个修复有效,为什么我的所有单元格都不会被错误地旋转
    • 好的,只是为了确认一下——在 {.5,.5} 上旋转单元格实际上是所需的行为。不过谢谢
    • 别担心,我不确定。我以前做过,但我面前没有代码,我知道我确实在旋转后调整了单元格位置,但那是因为我同时调整了表格视图和单元格的大小
    【解决方案2】:

    好消息 - 在花了很多时间试图解决这个问题之后,我偶然发现了解决方案。

    此代码被多次调用以用于“错误”单元格,显然由于 CALayer 和 CGAffineTranform 的一些复杂性,分配转换具有附加影响。

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    { 
        CGAffineTransform transform = CGAffineTransformMakeRotation(1.5707963);
        cell.transform = transform;
    }
    

    解决方案是将转换移动到单元格的 init 方法中,以保证每个单元格只设置一次。

    // ... init stuff  
    self.transform = CGAffineTranformMakeRotation(1.5707963);
    // ... more init stuff
    

    【讨论】:

      【解决方案3】:

      创建一个 UITableViewCell 的子类,它的 layoutSubviews 覆盖确保在那里设置转换:

      class InvertedTableViewCell: UITableViewCell {
          override func layoutSubviews() {
                  self.transform = CGAffineTranformMakeRotation(1.5707963)
              }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 2011-07-16
        • 1970-01-01
        • 2015-06-16
        • 2010-12-18
        • 1970-01-01
        • 2013-11-08
        相关资源
        最近更新 更多