项目里需要实现“田”字格视图拖拽交换四个格锅底数据,今天实现了发现还是蛮容易的,但是自己确实开始不知道如何下手。记录一下吧。
代码如下:
// 获取手势当前位置
let point = panrecognier.location(in: UIApplication.shared.keyWindow)
for currentItem in modelArray{
// 转换point在keyWindow的自定义视图的point
if let tempPoint = UIApplication.shared.keyWindow?.convert(point, to: currentItem.view) {
// 判断是否在view范围内
if currentItem.view.layer.contains(tempPoint){
if let replaceModel = currentItem.dishViewModel{
if currentItem.isReplace {
//之前有锅底的调用替换成功
if let delegate = delegate {
// 代理回调给控制器交换数据
let success = delegate.exchangeSuccess(model: replaceModel, replacedModel: item.dishViewModel!, index: currentItem.index, replacedIndex: item.index)
if success {
// 交换完成更新当前视图展示数据
let tempDishViewModel = currentItem.dishViewModel?.copyDishViewModel()
currentItem.dishViewModel = item.dishViewModel
modelArray[item.index].dishViewModel = tempDishViewModel
}
}
}
}
}
}
}
笔记:
1、pan手势:
// 拖拽
- (void)setUpPan
{
// 拖拽
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[self.imageView addGestureRecognizer:pan];
}
- (void)pan:(UIPanGestureRecognizer *)pan
{
//获取偏移量
// 返回的是相对于最原始的手指的偏移量
CGPoint transP = [pan translationInView:self.imageView];
// 移动图片控件
self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, transP.x, transP.y);
// 复位,表示相对上一次
[pan setTranslation:CGPointZero inView:self.imageView];
}
2、获取位置坐标:
locationInView:指手第一次按下时触发点相对于屏幕的坐标
translationInView:向左滑动/向右滑动时,相对于触发点的偏移量
比如:
location.x=50;translation.x=50;表示触发点.x=50,向右偏移50,当前手势松开的触发点x坐标50+50=100;
location.x=100;translation.x=-50;表示触发点.x=100,向左偏移50,当前手势松开的触发点x坐标100-50=50;
3、注意Model类复制注意引用问题;
4、视图赋值考虑Model处理:显示直接赋值dishViewModel,didSet处理即可。
class ShowPotModel {
var index : Int = 0
var isReplace = true
var dishViewModel : DishViewModel?{
didSet{
let url = dishViewModel?.dishModel.planeImageUrl ?? ""
if url.isEmpty {
imageView.kf.cancelDownloadTask()
imageView.image = nil
}else{
let transition = CATransition()
transition.type = CATransitionType(rawValue: "rippleEffect")
transition.duration = 1.5
imageView?.layer.add(transition, forKey: nil)
if let image = ImageDownLoader.shared.retrieveImageInMemoryCache(forKey: url) {
imageView.image = image
} else {
imageView?.kf.setImage(with: URL(string: url), options: nil, progressBlock: nil, completionHandler: nil)
}
}
}
}
//考虑用weak
weak var imageView: UIImageView!
weak var view : UIView!
}
参考链接:
iOS手势-UIPanGestureRecognizer:
https://www.jianshu.com/p/33e8dab5d11b
网友评论