我在UITableView
中有一个UIViewController
,还有一个过滤按钮。当用户开始向下滚动列表时,我隐藏了过滤器按钮。我想在第二个单元格(index 1
)可见时显示过滤器按钮。但是,我无法获得这种想要的效果,我只能在它到达顶部时才会出现。这是我的代码,当它到达顶部时(我再次显示过滤器按钮)。
//determines when the tableview was scrolled
-(void) scrollViewDidScroll:(UIScrollView *)scrollView
{
CGPoint currentOffset = scrollView.contentOffset;
//tableview is scrolled down
if (currentOffset.y > self.lastContentOffset.y)
{
//if the showFilter button is visible i.e alpha is greater than 0
if (self.showFilter.alpha==1.0) {
[UIView animateWithDuration:1 animations:^{
//hide show filter button
self.showFilter.alpha=0.0;
//I also adjust the frames of a tableview here
}];
}
}
//determines if it is scrolled back to the top
if (self.showFilter.alpha==0.0 && currentOffset.y==0) {
[UIView animateWithDuration:0.3 animations:^{
//show filter button
self.showFilter.alpha=1.0;
//i also adjust the frames of the tableview here
}];
}
self.lastContentOffset = currentOffset;
}
我也尝试过:
if (self.showFilter.alpha==0.0 && currentOffset.y<160)
但是当桌面视图跳出屏幕时,它无法达到预期的效果。还有另一种方法可以达到预期的效果吗?
答案 0 :(得分:3)
之前的回答建议您应在每次表格视图滚动时检查单元格是否可见(在scrollViewDidScroll:
中)。但是,你不应该这样做。这种方法可能会影响表视图的性能,因为每次表视图滚动时都必须执行检查。
相反,您只需要通过实施此UITableViewDelegate
方法每次检查新单元格时进行检查:
- (void)tableView:(nonnull UITableView *)tableView willDisplayCell:(nonnull UITableViewCell *)cell forRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
if ([indexPath isEqual:[NSIndexPath indexPathForRow:1 inSection:0]]) {
// perform action
}
}
在Swift 3之前,你会写下以下内容:
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if indexPath == NSIndexPath(forRow: 1, inSection: 0) {
// perform action
}
}
在Swift 3或更高版本中,您可以编写以下内容:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if indexPath == IndexPath(row: 1, section: 0) {
// perform action
}
}
在任何一种情况下,请不要忘记将UIViewController
子类设置为delegate
的{{1}}。