我如何复制;添加任务“;本机iOS提醒应用的行布局行为?

我如何复制;添加任务“;本机iOS提醒应用的行布局行为?,ios,swift,uitableview,layout,uiscrollview,Ios,Swift,Uitableview,Layout,Uiscrollview,如果该行位于可见区域下方,则提醒应用程序中的“添加任务”行将作为覆盖粘贴到UITableView的底部,如果该行位于可见区域内,则固定到最后一行 提醒应用程序的屏幕截图: 我尝试了几种方法,但无法使其按我所希望的方式工作: 使用父UIViewController,该控制器将新添加的视图约束到底部,并将优先级较低的lessThenEqual约束和equal约束约束约束到UITableView的空页脚视图。这工作得很好,但没有考虑到一个小的UITableView内容插入集(发生重叠),新视图

如果该行位于可见区域下方,则提醒应用程序中的“添加任务”行将作为覆盖粘贴到UITableView的底部,如果该行位于可见区域内,则固定到最后一行

提醒应用程序的屏幕截图:

我尝试了几种方法,但无法使其按我所希望的方式工作:

  • 使用父UIViewController,该控制器将新添加的视图约束到底部,并将优先级较低的lessThenEqual约束和equal约束约束约束到UITableView的空页脚视图。这工作得很好,但没有考虑到一个小的UITableView内容插入集(发生重叠),新视图不会滚动UITableView,它会覆盖UITableView的滚动指示器。我也不喜欢新推出的UIViewController
  • 使用UITableView footerView并在发生滚动时转换其帧。下面的代码是我第一次尝试,但是在
    footerView.transform=CGAffineTransform.identity
    之后,框架没有立即更新,因此框架无法使用。缓存初始帧会导致意外偏移和其他视觉故障

    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
       footerView.transform = CGAffineTransform.identity
       let delta = tableView.bounds.maxY - footerView.frame.maxY
       if delta < 0 {
          footerView.transform = CGAffineTransform(translationX: 0, y: delta)
       }
       tableView.bringSubviewToFront(footerView)
    }
    
    覆盖函数scrollViewDidScroll(scrollView:UIScrollView){
    footerView.transform=CGAffineTransform.identity
    设delta=tableView.bounds.maxY-footerView.frame.maxY
    如果δ<0{
    footerView.transform=CGAffineTransform(translationX:0,y:delta)
    }
    tableView.bringSubviewToFront(footerView)
    }
    

  • 您可能可以使用表视图来完成这项工作,但我很确定使用UICollectionView会更干净—查看自定义布局或集合视图—好的,谢谢。我以前从未使用过UICollectionView,但我认为UICollectionViewFlowLayout的sectionFootersPinToVisibleBounds正是我所需要的。