123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- //
- // TSImageIPanComparisonView.swift
- // testApp
- //
- // Created by 100Years on 2025/5/11.
- //
- import UIKit
- class TSImageIPanComparisonView: UIView , UIGestureRecognizerDelegate{
- // MARK: - 属性
- let oldImageView = UIImageView()
- let newImageView = UIImageView()
- private let lineView = UIView()
- private var maskLayer = CAShapeLayer()
-
- // MARK: - 初始化
- override init(frame: CGRect) {
- super.init(frame: frame)
- setupViews()
- }
-
- required init?(coder: NSCoder) {
- super.init(coder: coder)
- setupViews()
- }
-
- lazy var lineX:CGFloat = self.bounds.size.width/2.0 {
- didSet{
- updateView()
- }
- }
-
- lazy var panGesture: UIPanGestureRecognizer = {
- let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
- panGesture.delegate = self
- return panGesture
- }()
- // MARK: - 视图设置
- private func setupViews() {
- // 旧图片视图(初始显示)
- oldImageView.contentMode = .scaleAspectFill
- oldImageView.clipsToBounds = true
- addSubview(oldImageView)
-
- // 新图片视图(初始隐藏)
- newImageView.contentMode = .scaleAspectFill
- newImageView.clipsToBounds = true
- addSubview(newImageView)
-
- // 分割线样式
- lineView.backgroundColor = .white
- lineView.isHidden = true
- addSubview(lineView)
-
- let leftRigntImageView = UIImageView.createImageView(image: .leftContrastRight)
- addSubview(leftRigntImageView)
- leftRigntImageView.snp.makeConstraints { make in
- make.center.equalTo(lineView.snp.center)
- }
- addGestureRecognizer(panGesture)
-
- }
-
- func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
- shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
-
- if gestureRecognizer == panGesture {
- let velocity = panGesture.velocity(in: self)
- return abs(velocity.x) < abs(velocity.y) // 只有垂直速度更快时才响应
- }
- return true // 允许同时识别
- }
-
- // 处理拖动手势
- @objc private func handlePan(_ gesture: UIPanGestureRecognizer) {
- // 获取手指在视图中的移动距离(相对起点)
- let translation = gesture.translation(in: self)
- // 只处理水平移动
- if abs(translation.x) > abs(translation.y) {
- if translation.x > 0 {
- lineX = min(lineX + translation.x, self.width-1)
- } else if translation.x < 0 {
- lineX = max(lineX + translation.x, 0)
- }
- gesture.setTranslation(.zero, in: self)
- }
- }
- // MARK: - 布局
- override func layoutSubviews() {
- super.layoutSubviews()
- oldImageView.frame = bounds
- newImageView.frame = bounds
- lineView.frame = CGRect(x: lineX, y: 0, width: 1, height: bounds.height)
- }
-
- // MARK: - 公开方法
- func configure(oldImage: UIImage?, newImage: UIImage?) {
- oldImageView.image = oldImage
- newImageView.image = newImage
- lineView.isHidden = false
- updateView()
- }
-
- func configure(oldImageURLString: String, newImageURLString: String) {
- oldImageView.setAsyncImage(urlString: oldImageURLString)
- newImageView.setAsyncImage(urlString: newImageURLString)
- lineView.isHidden = false
- updateView()
- }
-
- // MARK: - 动画更新
- @objc private func updateView() {
- let x = lineX
- let frame = CGRect(
- x: x,
- y: 0,
- width: bounds.width - x,
- height: bounds.height
- )
- let path = UIBezierPath(rect: frame)
-
- // 更新分割线位置
- lineView.frame.origin.x = x
- // print("frame=\(frame)")
-
-
- maskLayer.path = path.cgPath
- newImageView.layer.mask = maskLayer
- }
- }
|