旋转的UITableView中未对齐的tableview单元格

时间:2012-02-14 15:38:51

标签: iphone ios uitableview cgaffinetransform

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

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

我已经缩小了在[tableView reloadData]调用完成后,第一个表格单元格完全脱离可见tableview rect的错误。 (即,如果我有4个表格单元格,A是完全可见并绘制的,B是视图的一半/一半,C和D完全脱离屏幕但尚未渲染,当我滚动到C时它是窃听,但当我滚动到D,它不是)。

现在有些代码 -

包含视图的init

- (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中的位置。

如果有一些关键信息我可能会遗漏,请告诉我。谢谢!

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

这个代码被多次调用'bugged'单元格,显然由于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

答案 2 :(得分:0)

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

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