由于系统的UIDatePicker和UIPickerView 都是当前选中的 近 其他的远的效果,未能满足项目需求 ,就想着自定义来解决
首先贴上效果图

我采用的是 左右分别是两个列表,拿到中间的cell的坐标,改变数据的状态,刷新列表达到效果(这里需要注意的是 手势 问题 突然松手,跟慢慢松手调用的scrollview代理不一样)上代码
// 突然松手 执行 慢慢松手不执行 执行下一个方法
func scrollViewDidEndDecelerating(_scrollView:UIScrollView) {
scrollToItem(scrollView)
}
//拖拽超过cell高度一半 就跳 下一个 或者上一个
func scrollViewDidEndDragging(_scrollView:UIScrollView, willDecelerate decelerate:Bool) {// 手拖拽cell着滑 decelerate 是false 手猛滑一下 给他一个自己减速的过程 是true
ifdecelerate ==false{//当手拖动的时候(没有自己减速效果)
scrollToItem(scrollView)
}
// 为什么在没有减速效果的时候 调用呢 是因为 如果有减速效果的话 会执行scrollViewDidEndDecelerating 这个滑动停止方法
}
再者 判断当前滚动的偏移量 是否是cell高度的倍数
// 整体滚动item 超过item 一半的偏移量 就跳下一个 否则还是当前
private func scrollToItem(_scrollView:UIScrollView){
lety :CGFloat= scrollView.contentOffset.y
letspace =Int(y)%Int(rowH)
varrow :Int=0
ifspace>=(Int(rowH)/2){
row =Int(y/rowH+1)
}else{
row =Int(y/rowH)
}
ifscrollView.isEqual(leftTableView){
if y==0{// 偏移量为0 的时候 主动更改颜色
changeCurrentItemColor(leftTableView)
}
self.leftTableView.setContentOffset(CGPoint(x:0, y:CGFloat(row) *rowH), animated:true)
}else{
if y==0{
changeCurrentItemColor(rightTableView)
}
self.rightTableView.setContentOffset(CGPoint(x:0, y:CGFloat(row) *rowH), animated:true)
}
}
拿到中心坐标 更改数据源 刷新列表
let x = ((UIDevice.width()-100)/55*61-120)/2// 列表一半的高度
let index =leftTableView.indexPathForRow(at:CGPoint(x:0, y: scrollView.contentOffset.y+x))//中心展示的item
实现效果

网友评论