美文网首页iOS学习iOS Developer
MMDraggableTagView实现排坑

MMDraggableTagView实现排坑

作者: Michaelin | 来源:发表于2017-03-27 11:50 被阅读31次

最近需要实现个MMDraggableTagView来实现类似网易新闻中的新闻类型管理或者其他的应用中标签管理页面,同时需要它最好能够拖拽,同时可以有层级关系。在工程中我们使用了 SnapKit 来管理autolayout的constraints,这个三方库和 Masonry 类似,只是 one for ObjC, one for Swift.

问题列表(Swift菜鸟问题,熟练工略过)

1. 通过SnapKit,重复更新autolayout时,页面显示位置不正常
最初采用public func makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void)来添加constraints,但是重复使用会遗留下之前添加的constraints。需要使用public func remakeConstraints(_ closure: (_ make: ConstraintMaker) -> Void)来实现删除之前的constraints,并创建新的constraints。

2. 通过更新视图的constraints来实现视图的动画效果。
一开始通过在UIView的animate block中实现constraints更新,但是并没有动画效果
正确方法是:

UIView.animate(withDuration: 0.2, animations: {
      self.relocateTags()         // update autolayout constraints by SnapKit.
      self.layoutIfNeeded()       // call layout method if needed to update subviews.
})

需要调用layoutIfNeeded()来更新子页面,不然其实子视图不会更新位置,只更新constraints。

3. 视图被拖拽时,出现视图因为之前的关联对象的位移,而产生同样的位移
考虑是因为之前被拖拽视图设置的与周边子视图相关的constraints导致的。因此可以通过SnapKit中的public func removeConstraints()来直接删除所有的限制。但是因为删除了所有constraints,会导致视图移动到最初左上角的位置。因此采用了个折中的办法,

draggingCell!.snp.remakeConstraints { (make) in
      make.top.equalTo(self).offset(draggingCell!.frame.origin.y)
      make.left.equalTo(self).offset(draggingCell!.frame.origin.x)
}

更新他的constraints,删除与周边subviews相关的constraints,设置为与superview的相关关系。这样就不会因为相关的subviews的位置变化而影响自己的视图。

未完待续

相关文章

  • MMDraggableTagView实现排坑

    最近需要实现个MMDraggableTagView来实现类似网易新闻中的新闻类型管理或者其他的应用中标签管理页面,...

  • 日常总结系列

    JS实现一些经典算法:1,基于填坑思想的快排算法2,十进制转十六进制 NODEJS抓包的坑 利用request模块...

  • Spring排坑

    总结一些前人踩过的雷后续可以深入分析一下 spring mvc 对于返回 void的方法会调用默认的视图解析器 这...

  • tensorboard排坑

    按照官方文档的说法做,在显示graph时提示“No graph definition files were fou...

  • centos系统搭建redis集群

    排坑 坑1 更换境内gem源 坑2 ruby版本升级 在安装redis官方给的工具:redis-trib.rb 这...

  • NoClassDefFoundError排坑经历

    1. 前言 实习做NLP任务时,在离线train获得模型bin文件后,在部署到线上之前经常需要测试一下QPS等指标...

  • Flutter使用排坑

    1.运行flutter_console.bat文件提示无法找到该文件的问题 解决方法是右键点击以管理员身份运行该文...

  • 排坑指南 Troubleshooting

    Integration with Existing Apps 执行yarn start之后出错,显示8081端口被...

  • Flutter初学排坑

    一.坑系列 1.更改package 要改src/debug/AndroidManifest.xml里的packag...

  • Hexo使用

    hexo在使用过程中有很多地方还是需要排坑的,我把排过的坑记录?一下 首先推荐一个主题,真的很赞https://w...

网友评论

    本文标题:MMDraggableTagView实现排坑

    本文链接:https://www.haomeiwen.com/subject/vualottx.html