// // 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 } }