核心代码

1.

2.

3.

界面代码VFL

/* 浏览作品view*/import UIKit/***  图片浏览器(大图和缩略图)*/
class JYBrowseWorksView: UIView {/// 数据源参数(外界传入)var dataArray:[WorkImagesProtocol] = [] {didSet{self.topCollectionView.reloadData()self.bottomCollectionView.reloadData()if dataArray.isEmpty {self.topCollectionView.backgroundView = self.emptyViewbottomCollectHeight?.constant = 0self.topCollectionView.backgroundColor = UIColor(hexColor: "F9F9F9")}else{self.topCollectionView.backgroundView = nilbottomCollectHeight?.constant = 70self.topCollectionView.backgroundColor = UIColor.white}}}/// 照片比例类型(默认1:1)var photoSizeType: JYMyCenterPhotoHeightType = .squareType {didSet{self.collectionHeightConstraint?.constant = photoSizeType.photoHeightif photoSizeType == .rectangleType {self.collectionMegrainConstraint?.constant = 72}else {self.collectionMegrainConstraint?.constant = 24}}}/// 当前显示的图片索引private var selectIndex:Int = 0 {didSet{self.reloadCollectionUI()}}/// 空页面private let emptyView = JYZDEmptyView(emptyAreement: JYEmptyViewStruct(emptyType: .noImageEmptyType, offsetY: -70, titleTipStr: "暂无作品", buttonTitleStr: nil))/// 底部相册的高度约束private var bottomCollectHeight: NSLayoutConstraint?/// 可分页滑动collectionViewprivate lazy var topCollectionView : UICollectionView = {let layout = UICollectionViewFlowLayout()layout.scrollDirection = .horizontallayout.itemSize = CGSize(width: JY_DEVICE_WIDTH, height: self.photoSizeType.photoHeight)let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)collectionView.translatesAutoresizingMaskIntoConstraints = falsecollectionView.backgroundColor = UIColor.whitecollectionView.isPagingEnabled = truecollectionView.showsVerticalScrollIndicator = falsecollectionView.showsHorizontalScrollIndicator = falsereturn collectionView}()/// 可选择点中的collectionviewprivate var bottomCollectionView : UICollectionView = {let layout = UICollectionViewFlowLayout()layout.scrollDirection = .horizontallayout.itemSize = CGSize(width: 70, height: 70)let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)collectionView.translatesAutoresizingMaskIntoConstraints = falsecollectionView.backgroundColor = UIColor.whitecollectionView.showsVerticalScrollIndicator = falsecollectionView.showsHorizontalScrollIndicator = falsereturn collectionView}()/// topcollectionView 开始滑动时的位移private var startContentOffsetX : CGFloat = 0/// topcollectionView 将要停止滑动时的位移private var willEndContentOffsetX : CGFloat = 0/// 控制高度的约束private var collectionHeightConstraint: NSLayoutConstraint?/// 控制距离的约束private var collectionMegrainConstraint: NSLayoutConstraint?override init(frame: CGRect) {super.init(frame: frame)self.translatesAutoresizingMaskIntoConstraints = falseself.configerUI()}required init?(coder aDecoder: NSCoder) {fatalError("init(coder:) has not been implemented")}/// 刷新collectionview的UIprivate func reloadCollectionUI() {let endContentOffsetX = topCollectionView.contentOffset.xif endContentOffsetX < willEndContentOffsetX , willEndContentOffsetX < startContentOffsetX {DDLOG(message: "左移")if !bottomCollectionView.indexPathsForVisibleItems.contains(IndexPath(item: selectIndex, section: 0)) {bottomCollectionView.selectItem(at: IndexPath(item: selectIndex, section: 0), animated: true, scrollPosition: UICollectionView.ScrollPosition.left)}} else if endContentOffsetX > willEndContentOffsetX , willEndContentOffsetX > startContentOffsetX {DDLOG(message: "右移")if !bottomCollectionView.indexPathsForVisibleItems.contains(IndexPath(item: selectIndex, section: 0)) {bottomCollectionView.selectItem(at: IndexPath(item: selectIndex, section: 0), animated: true, scrollPosition: UICollectionView.ScrollPosition.right)}}self.bottomCollectionView.reloadData()}
}// MARK: - UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout
extension JYBrowseWorksView : UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {return self.dataArray.count}func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "JYBrowseWorksCollectionCell", for: indexPath) as! JYBrowseWorksCollectionCellcell.configerCellData(imageData: dataArray[indexPath.row])if collectionView == bottomCollectionView {let select = selectIndex == indexPath.row ? true : falsecell.configerSelectCell(isSelect: select)}else {
//            cell.imageView.contentMode = .scaleAspectFit
//            cell.clipsToBounds = false}return cell}func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {if collectionView == topCollectionView {return 0.0001}return 10}func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {if collectionView == topCollectionView {return 0}return 10}func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {if collectionView == topCollectionView {return UIEdgeInsets.zero}return UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)}func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {if collectionView == bottomCollectionView {selectIndex = indexPath.rowtopCollectionView.scrollToItem(at: IndexPath(item: indexPath.row, section: 0), at: UICollectionView.ScrollPosition.left, animated: true)}}/// 滑动顶部collectionview,底部collectionview显示顶部当前显示的图片////// - Parameter scrollView: scrollView descriptionfunc scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {if scrollView == topCollectionView {let x = scrollView.contentOffset.xlet i:Int = Int(x/UIScreen.main.bounds.size.width)self.selectIndex = i}}/// 获取将要滑动时位移/// 用于判断滑动方向/// - Parameter scrollView: scrollView descriptionfunc scrollViewWillBeginDragging(_ scrollView: UIScrollView) {if scrollView == topCollectionView {startContentOffsetX = scrollView.contentOffset.x}}/// 获取将要结束时 topCollectionView 的位移///  用于判断 滑动方向/// - Parameters:///   - scrollView: scrollView description///   - velocity: velocity description///   - targetContentOffset: targetContentOffset descriptionfunc scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {if scrollView == topCollectionView {willEndContentOffsetX = scrollView.contentOffset.x}}
}// MARK: - UI布局
extension JYBrowseWorksView {private func configerUI() {topCollectionView.delegate = selftopCollectionView.dataSource  = selfbottomCollectionView.delegate = selfbottomCollectionView.dataSource = selftopCollectionView.register(JYBrowseWorksCollectionCell.classForCoder(), forCellWithReuseIdentifier: "JYBrowseWorksCollectionCell")bottomCollectionView.register(JYBrowseWorksCollectionCell.classForCoder(), forCellWithReuseIdentifier: "JYBrowseWorksCollectionCell")self.addSubview(topCollectionView)self.addSubview(bottomCollectionView)let vd:[String:UIView] = ["topCollectionView":topCollectionView,"bottomCollectionView":bottomCollectionView]self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|[topCollectionView]|", options: [], metrics: nil, views: vd))self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|[bottomCollectionView]|", options: [], metrics: nil, views: vd))self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[topCollectionView]", options: [], metrics: nil, views: vd))self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[bottomCollectionView]|", options: [], metrics: nil, views: vd))self.collectionHeightConstraint = topCollectionView.heightAnchor.constraint(equalToConstant: JY_DEVICE_WIDTH)self.collectionHeightConstraint?.isActive = trueself.collectionMegrainConstraint = bottomCollectionView.topAnchor.constraint(equalTo: topCollectionView.bottomAnchor, constant: 24)self.collectionMegrainConstraint?.isActive = truebottomCollectHeight = bottomCollectionView.heightAnchor.constraint(equalToConstant: 70)bottomCollectHeight?.isActive = true}
}

  

转载于:https://www.cnblogs.com/qingzZ/p/10276011.html

swift - scrollview 判断左右移动, 以及上下两个view联动相关推荐

  1. 给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

    1. 问题描述 给定排的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X.给出一个O(nlg(n))的算法. 2. 解决思路 首先对数组进行排序,如果使用归并的排序的话,算法的复杂度在nl ...

  2. 原生微信小程序,scroll-view的使用,一屏两个滚动区域,scroll-y(纵向滚动)

    原生微信小程序,scroll-view的使用,一屏两个滚动区域,scroll-y(纵向滚动) 这个会简单很多 结构层 <view class="container">& ...

  3. Swift 5 判断数组中是否包含字符串,忽略大小写

    系统: Mac OS 10.15.2, XCode 11.3,swift 5.0 写作时间:2020-01-08 说明 Swift 5 判断数组中是否包含字符串,忽略大小写 let list = [& ...

  4. javascript判断日期奇偶_JavaScript判断奇数和偶数的两种方法

    JavaScript是前端开发中必不可少的一部分,那你知道如何用JS判断一个数是奇数还偶数吗?这篇文章就给大家分享JS判断奇数和偶数的两种方法,有一定的参考价值,感兴趣的朋友可以参考一下. 方法一:用 ...

  5. IOS delegate 委托 使用 两个View之间传数据

    今天讲述 delegate 的使用,并给出例子来说明如何使用delegate在两个View之间传送数据 1.建立一个 single view 工程 2.在viecontroller.xib文件里面放上 ...

  6. android 仿美团联动,仿美团弹出分类选择框(左右两个listview联动)

    [实例简介] 左边产品大类,选择某一类后在右边展开其中的小类,用两个listview联动实现 [实例截图] [核心代码] 1535269showPopWindow └── showPopWindow ...

  7. Android 两个ListView联动,仿电影展示界面

    Android 两个ListView联动,仿电影展示界面 需要导入的依赖包: compile 'com.squareup.picasso:picasso:2.5.2' compile 'io.reac ...

  8. Android 两个view并列显示

    两个view并列显示,第二个view跟在第一个view的后面,如果长度过长,则第一个view宽度缩小. 直接上代码  用就完了! public class TextWithImageLayout ex ...

  9. 微信小程序两个view同一行两侧对齐

    微信小程序中实现两个view容器,同一行两侧对齐布局.将两个view容器,放在一个父view容器中,在父view容器css样式中加入以下属性即可实现预期效果. display: flex; flex- ...

最新文章

  1. HomeKit推出已两年 但是苹果在智能家居上却被对手甩开了差距
  2. [转] fastText
  3. Atitit 项目的主体设计与结构文档 v5
  4. P3891-[GDOI2014]采集资源【背包,dp】
  5. ajax json 封装,Ajax--json(Ajax调用返回json封装代码、格式及注意事项)
  6. TensorFlow保存和恢复模型的方法总结
  7. wxpython菜单的位置_wxpython教程:[5]次级菜单
  8. Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总
  9. linux 随机函数,Linux系统产生随机数方法
  10. mac安装jad反编译工具
  11. x64位xp连接位于32位xp系统上的打印机
  12. seige压力测试用法
  13. java多线程技术体系
  14. 《自為墓誌銘·〔明〕張岱》原文|譯文|注釋|賞析
  15. matlab如何打开dcm_MATLAB绘图干货
  16. HTML的背景颜色和背景图片
  17. 使用python的虚拟环境virtualenv
  18. 6开机白苹果一闪一灭_我的苹果6p突然死机,一直出现白苹果又黑屏,反复出现,无法开机,请...
  19. termux最新安装kali
  20. WEB开发中,使用JSON-RPC好,还是RESTful API好?

热门文章

  1. Eratosthenes,筛法求素数
  2. 一个把时间戳转成日期的javascript函数
  3. 9.28 csp-s模拟测试54 x+y+z
  4. python全栈开发_day20_加密模块和excel操作模块以及xml
  5. 5.7 并行复制配置 基于GTID 搭建中从 基于GTID的备份与恢复,同步中断处理
  6. Spark 异步Action
  7. 一句话的设计模式(JAVA版)
  8. Visual Studio Developer Assistant 3月新功能展示
  9. 让搜索显示中文的方法
  10. 什么是事务的传播特性?(转载)