作为一个小背景,我正在构建一个旋转的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中的位置。
如果有一些关键信息我可能会遗漏,请告诉我。谢谢!
答案 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)
}
}