sha*_*sha 8 cocoa-touch objective-c uitableview ios autolayout
我在故事板文件中定义了一个自定义表格视图单元格.

此单元格包含滚动视图,其中包含少量内容页面和页面指示符.滚动视图,内容视图和单元格本身都使用自动布局定义.Page1/2/3视图绑定的宽度与滚动视图相同,容器绑定的宽度为滚动视图的3倍.这样我就不确定内容的大小是否与显示三页信息无关,无论屏幕大小如何.
我在自定义单元格类中有一个代码,当滚动视图滚动时更新页面指示器 - 这很好.
我还在单元类中公开了方法来从外部指定页面,在这个setter中我正在做类似的事情:
- (void)setPage:(NSInteger)page animated:(BOOL)animated
{
CGFloat pageWidth = self.scrollView.frame.size.width;
self.pageControl.currentPage = page;
[self.scrollView setContentOffset:CGPointMake(page*pageWidth, 0) animated:animated];
}
Run Code Online (Sandbox Code Playgroud)
我正面临的问题是滚动视图框架,当我调用此setter时,内容大小未正确定义,因此页面指示器将被设置,但滚动视图不会更改内容偏移.
我在哪里可以看到我的单元格自动布局完成的时刻,我可以保证setContentOffset可以工作?我曾尝试致电setPage从cellForIndexPath-这显然是行不通的,然后我试图从称呼它willDisplayCell-同样的故事-细胞本身已经奠定了正常,但鉴于滚动仍然有600px的(从故事板),它失败.
sha*_*sha 20
我最后做了以下事情:
在自定义单元子类中添加了layoutSubview实现
- (void)layoutSubviews
{
[super layoutSubviews];
[self.contentView layoutSubviews];
// set proper content offset
[self.scrollView setContentOffset:CGPointMake(self.frame.size.width*self.pageControl.currentPage, 0) animated:NO];
}
Run Code Online (Sandbox Code Playgroud)
没有我直接调用layoutSubview上contentView滚动查看,竟没有经过适当的帧[super layoutSubview]结束了.
我没有必要将当前页码存储在内部变量中,因为pageControl已经保存它并且在配置原始单元信息时设置它.
有趣的是 - 最初我[self.scrollView layoutSubview]在内部添加了这个方法,它在iOS8中运行良好,但在iOS7中没有做任何好事.我不得不上升一层,contentView以确保它在7和8都有效.
您似乎已决定进行定制实施,因此以下是可能有效的方法。
在表视图设置其子视图之前调用您的-setPage:animated:方法,让单元格有机会执行相同的操作,否则自动布局启动将不起作用,除非您在单元格中维护某种状态(可能只是页码)并对以下一项或多项机会:
等待-viewDidLayoutSubviewsUITableViewController 的方法触发,然后调用-cellForRowAtIndexPath:以获取单元格。然后单元格应该有一个有效的框架。
在您的自定义 UITableViewCell 中覆盖-didMoveToSuperview。当这被调用时,框架也应该是有效的。
在上述任一点之后,您可以检查自定义单元格的状态(其中应包含要显示的页码)并滚动到适当的点。重构您的方法来设置状态(单元格上的整数属性)并拥有一个单独的私有方法可能是有意义的,-setPage:animated:上面的两个覆盖之一可以调用该方法来计算偏移量并进行滚动。
建议的替代方案:
您可以通过在单元格的contentView. 当前实现 UITableViewDataSource 的 UIViewController 也可以实现 UICollectionViewDataSource 并提供集合视图及其单元格。
假设您的 UITableView 单元格是屏幕的宽度和高度,您可以将嵌入式集合视图配置为基本上水平分页(因为 UICollectionView 是 UIScrollView 的子类)。
设置集合视图时,使用 UICollectionViewFlowLayout 作为布局对象并按如下方式配置:
// Ensure the collection view scrolls horizontally.
let flowLayout = UICollectionViewFlowLayout();
flowLayout.scrollDirection = .Horizontal;
let collectionView = UICollectionView(frame:tableCellFrame, layout:flowLayout);
// These are actually UIScrollView properties.
collectionView.pagingEnabled = true;
collectionView.bounces = false;
Run Code Online (Sandbox Code Playgroud)
然后,您将每个内容页面放入自定义 UICollectionViewCell 中,集合视图将为您对它们进行分页。这样做的额外好处是免费为您提供分页滚动 API。
| 归档时间: |
|
| 查看次数: |
7412 次 |
| 最近记录: |