|
@@ -0,0 +1,486 @@
|
|
|
|
+//
|
|
|
|
+// TSAIRemovePhotlVC.swift
|
|
|
|
+// TSLiveWallpaper
|
|
|
|
+//
|
|
|
|
+// Created by 100Years on 2025/7/3.
|
|
|
|
+//
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class TSAIRemovePhotlVC: TSAIUploadPhotoVC {
|
|
|
|
+ private let minZoomScale: CGFloat = 1.0
|
|
|
|
+ private let maxZoomScale: CGFloat = 4.0
|
|
|
|
+ private let zoomSensitivity: CGFloat = 0.2 // 灵敏度系数 (0.1-1.0)
|
|
|
|
+ lazy var scrollView: UIScrollView = {
|
|
|
|
+ let sv = UIScrollView()
|
|
|
|
+ sv.minimumZoomScale = 1.0
|
|
|
|
+ sv.maximumZoomScale = 4.0
|
|
|
|
+ sv.showsHorizontalScrollIndicator = false
|
|
|
|
+ sv.showsVerticalScrollIndicator = false
|
|
|
|
+ sv.delegate = self
|
|
|
|
+ sv.backgroundColor = .yellow.withAlphaComponent(0.1)
|
|
|
|
+ return sv
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ private let drawingImageView: UIImageView = {
|
|
|
|
+ let iv = UIImageView()
|
|
|
|
+ iv.contentMode = .scaleAspectFit
|
|
|
|
+ iv.isUserInteractionEnabled = true
|
|
|
|
+ iv.clipsToBounds = true
|
|
|
|
+ return iv
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ private let slider: UISlider = {
|
|
|
|
+ let slider = UISlider()
|
|
|
|
+ slider.minimumValue = 1
|
|
|
|
+ slider.maximumValue = 30
|
|
|
|
+ slider.setThumbImage(UIImage.circle(diameter: 10, color: .themeColor), for: .normal)
|
|
|
|
+ slider.minimumTrackTintColor = UIColor.themeColor
|
|
|
|
+ slider.maximumTrackTintColor = .white.withAlphaComponent(0.2)
|
|
|
|
+ slider.value = 5
|
|
|
|
+ return slider
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ private let clearButton: UIButton = {
|
|
|
|
+ let button = UIButton.createButton(image: .aiRemoveClear)
|
|
|
|
+ return button
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ private let undoButton: UIButton = {
|
|
|
|
+ let button = UIButton.createButton(image: .aiRemoveBack)
|
|
|
|
+ return button
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ private let redoButton: UIButton = {
|
|
|
|
+ let button = UIButton.createButton(image: .aiRemoveGo)
|
|
|
|
+ return button
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ lazy var panLineLabel: UILabel = UILabel.createLabel(text: "\(brushWidth)",font: .font(size: 14),textColor: .white)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private var lastPoint = CGPoint.zero
|
|
|
|
+ private var swiped = false
|
|
|
|
+ private var brushWidth: CGFloat = 5.0
|
|
|
|
+ private var brushColor: UIColor = .themeColor
|
|
|
|
+
|
|
|
|
+ private var drawingHistory: [UIImage] = [UIImage()]
|
|
|
|
+ private var historyIndex: Int = 0
|
|
|
|
+
|
|
|
|
+ // 用于记录缩放前的状态
|
|
|
|
+ private var scale: CGFloat = 1.0
|
|
|
|
+ private var touchCenter: CGPoint = .zero
|
|
|
|
+
|
|
|
|
+ func setUpRemoveUploadView(){
|
|
|
|
+ let spaceH = 176.0
|
|
|
|
+ uploadImageViewMaxHeight = k_ScreenHeight-spaceH-k_Height_safeAreaInsetsBottom()-k_Nav_Height
|
|
|
|
+ uploadImageBgView.backgroundColor = .blue.withAlphaComponent(0.1)
|
|
|
|
+ uploadImageBgView.snp.makeConstraints { make in
|
|
|
|
+ make.width.equalTo(k_ScreenWidth)
|
|
|
|
+ make.height.equalTo(uploadImageViewMaxHeight)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ override func setUpStackView() {
|
|
|
|
+ setUpRemoveUploadView()
|
|
|
|
+
|
|
|
|
+ setupUI()
|
|
|
|
+ setupGestures()
|
|
|
|
+ setupActions()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ override func updateUploadImageViewFrame() {
|
|
|
|
+ super.updateUploadImageViewFrame()
|
|
|
|
+
|
|
|
|
+ historyIndex = 0
|
|
|
|
+ drawingHistory = [UIImage()]
|
|
|
|
+ drawingImageView.image = drawingHistory[historyIndex]
|
|
|
|
+ updateUndoRedoButtons()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // MARK: - Setup
|
|
|
|
+
|
|
|
|
+ private func setupUI() {
|
|
|
|
+ //添加底层滚动视图
|
|
|
|
+ scrollView.addSubview(uploadImageBgView)
|
|
|
|
+ uploadImageBgView.snp.makeConstraints { make in
|
|
|
|
+ make.edges.equalToSuperview()
|
|
|
|
+ make.width.height.equalToSuperview()
|
|
|
|
+ }
|
|
|
|
+ cusStackView.addSubviewToStack(scrollView)
|
|
|
|
+
|
|
|
|
+ // 添加绘图视图
|
|
|
|
+ uploadImageView.addSubview(drawingImageView)
|
|
|
|
+ drawingImageView.snp.makeConstraints { make in
|
|
|
|
+ make.edges.equalToSuperview()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //stack add
|
|
|
|
+
|
|
|
|
+ let toolBtnView = UIView()
|
|
|
|
+ toolBtnView.addSubview(undoButton)
|
|
|
|
+ toolBtnView.addSubview(redoButton)
|
|
|
|
+ toolBtnView.addSubview(clearButton)
|
|
|
|
+ cusStackView.addSubviewToStack(toolBtnView)
|
|
|
|
+
|
|
|
|
+ toolBtnView.snp.makeConstraints { make in
|
|
|
|
+ make.height.equalTo(40)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ undoButton.snp.makeConstraints { make in
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ make.leading.equalTo(16)
|
|
|
|
+ make.width.height.equalTo(24)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ redoButton.snp.makeConstraints { make in
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ make.leading.equalTo(60)
|
|
|
|
+ make.width.height.equalTo(24)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ clearButton.snp.makeConstraints { make in
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ make.trailing.equalTo(-16)
|
|
|
|
+ make.width.height.equalTo(24)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ let slideView = UIView()
|
|
|
|
+ let panImageView = UIImageView.createImageView(image: .aiRemovePen)
|
|
|
|
+ slideView.addSubview(panImageView)
|
|
|
|
+ slideView.addSubview(slider)
|
|
|
|
+ slideView.addSubview(panLineLabel)
|
|
|
|
+ cusStackView.addSubviewToStack(slideView)
|
|
|
|
+
|
|
|
|
+ slideView.snp.makeConstraints { make in
|
|
|
|
+ make.height.equalTo(40)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ panImageView.snp.makeConstraints { make in
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ make.leading.equalTo(16)
|
|
|
|
+ make.width.height.equalTo(24)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ slider.snp.makeConstraints { make in
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ make.leading.equalTo(62)
|
|
|
|
+ make.trailing.equalTo(-55)
|
|
|
|
+ make.width.height.equalTo(24)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ panLineLabel.snp.makeConstraints { make in
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ make.trailing.equalTo(-16)
|
|
|
|
+ make.height.equalTo(24)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ func creatToolView(){
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private func setupGestures() {
|
|
|
|
+ // 绘图手势
|
|
|
|
+ let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handleDrawingPan(_:)))
|
|
|
|
+ panGesture.minimumNumberOfTouches = 1
|
|
|
|
+ panGesture.maximumNumberOfTouches = 1
|
|
|
|
+ drawingImageView.addGestureRecognizer(panGesture)
|
|
|
|
+
|
|
|
|
+ // 双指缩放手势
|
|
|
|
+ let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
|
|
|
|
+ pinchGesture.delegate = self
|
|
|
|
+ scrollView.addGestureRecognizer(pinchGesture)
|
|
|
|
+
|
|
|
|
+ // 拖动手势(用于移动图片)
|
|
|
|
+ let dragGesture = UIPanGestureRecognizer(target: self, action: #selector(handleDrag(_:)))
|
|
|
|
+ dragGesture.minimumNumberOfTouches = 2
|
|
|
|
+ dragGesture.maximumNumberOfTouches = 2
|
|
|
|
+ dragGesture.delegate = self
|
|
|
|
+ scrollView.addGestureRecognizer(dragGesture)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private func setupActions() {
|
|
|
|
+ slider.addTarget(self, action: #selector(brushSizeChanged(_:)), for: .valueChanged)
|
|
|
|
+ clearButton.addTarget(self, action: #selector(clearDrawing), for: .touchUpInside)
|
|
|
|
+ undoButton.addTarget(self, action: #selector(undoDrawing), for: .touchUpInside)
|
|
|
|
+ redoButton.addTarget(self, action: #selector(redoDrawing), for: .touchUpInside)
|
|
|
|
+// generateButton.addTarget(self, action: #selector(generateImage), for: .touchUpInside)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // MARK: - Drawing Methods
|
|
|
|
+
|
|
|
|
+ @objc private func handleDrawingPan(_ gesture: UIPanGestureRecognizer) {
|
|
|
|
+ let currentPoint = gesture.location(in: drawingImageView)
|
|
|
|
+
|
|
|
|
+ if gesture.state == .began {
|
|
|
|
+ swiped = false
|
|
|
|
+ lastPoint = currentPoint
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if gesture.state == .changed {
|
|
|
|
+ swiped = true
|
|
|
|
+ drawLine(from: lastPoint, to: currentPoint)
|
|
|
|
+ lastPoint = currentPoint
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if gesture.state == .ended {
|
|
|
|
+ if !swiped {
|
|
|
|
+ // 绘制单点
|
|
|
|
+ drawLine(from: lastPoint, to: lastPoint)
|
|
|
|
+ }
|
|
|
|
+ saveDrawingToHistory()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private func drawLine(from fromPoint: CGPoint, to toPoint: CGPoint) {
|
|
|
|
+ UIGraphicsBeginImageContextWithOptions(drawingImageView.bounds.size, false, 0.0)
|
|
|
|
+
|
|
|
|
+ guard let context = UIGraphicsGetCurrentContext() else { return }
|
|
|
|
+
|
|
|
|
+ // 绘制现有图像
|
|
|
|
+ drawingImageView.image?.draw(in: drawingImageView.bounds)
|
|
|
|
+
|
|
|
|
+ // 绘制线条
|
|
|
|
+ context.move(to: fromPoint)
|
|
|
|
+ context.addLine(to: toPoint)
|
|
|
|
+ context.setLineCap(.round)
|
|
|
|
+ context.setLineWidth(brushWidth)// / scrollView.zoomScale) // 根据缩放比例调整画笔粗细
|
|
|
|
+ context.setStrokeColor(brushColor.cgColor)
|
|
|
|
+ context.setBlendMode(.normal)
|
|
|
|
+ context.strokePath()
|
|
|
|
+
|
|
|
|
+ // 设置新图像
|
|
|
|
+ drawingImageView.image = UIGraphicsGetImageFromCurrentImageContext()
|
|
|
|
+ UIGraphicsEndImageContext()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // MARK: - History Management
|
|
|
|
+
|
|
|
|
+ private func saveDrawingToHistory() {
|
|
|
|
+ guard let currentDrawing = drawingImageView.image else { return }
|
|
|
|
+
|
|
|
|
+ if historyIndex < drawingHistory.count - 1 {
|
|
|
|
+ drawingHistory.removeSubrange(historyIndex+1..<drawingHistory.count)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ drawingHistory.append(currentDrawing)
|
|
|
|
+ historyIndex = drawingHistory.count - 1
|
|
|
|
+ updateUndoRedoButtons()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private func updateUndoRedoButtons() {
|
|
|
|
+ undoButton.isEnabled = historyIndex > 0
|
|
|
|
+ redoButton.isEnabled = historyIndex < drawingHistory.count - 1
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // MARK: - Actions
|
|
|
|
+
|
|
|
|
+ @objc private func brushSizeChanged(_ sender: UISlider) {
|
|
|
|
+ brushWidth = CGFloat(sender.value)
|
|
|
|
+// panLineLabel.text = "\(brushWidth)"
|
|
|
|
+ panLineLabel.text = String(format: "%.1f", brushWidth)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @objc private func clearDrawing() {
|
|
|
|
+ drawingImageView.image = nil
|
|
|
|
+ saveDrawingToHistory()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @objc private func undoDrawing() {
|
|
|
|
+ guard historyIndex > 0 else { return }
|
|
|
|
+ historyIndex -= 1
|
|
|
|
+ drawingImageView.image = drawingHistory[historyIndex]
|
|
|
|
+ updateUndoRedoButtons()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @objc private func redoDrawing() {
|
|
|
|
+ guard historyIndex < drawingHistory.count - 1 else { return }
|
|
|
|
+ historyIndex += 1
|
|
|
|
+ drawingImageView.image = drawingHistory[historyIndex]
|
|
|
|
+ updateUndoRedoButtons()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ override func generateImage() {
|
|
|
|
+
|
|
|
|
+ if kJudgeVip(externalBool: true, vc: self){ return } //判断 vip
|
|
|
|
+ guard let upLoadImage = upLoadImage else { return }
|
|
|
|
+ guard let maskImage = getBlackWhiteMaskImage() else { return }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ let generatorModel = TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)
|
|
|
|
+ generatorModel.upLoadImages = [upLoadImage,maskImage]
|
|
|
|
+
|
|
|
|
+ let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel:generatorModel){ model in }
|
|
|
|
+ gennerateVC.backstageBlock = { [weak self] in
|
|
|
|
+ guard let self = self else { return }
|
|
|
|
+ TSAIListHistoryVC.showPosition()
|
|
|
|
+ self.navigationController?.popToRootViewController(animated: false)
|
|
|
|
+ }
|
|
|
|
+ kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+extension TSAIRemovePhotlVC {
|
|
|
|
+
|
|
|
|
+ func getBlackWhiteMaskImage() -> UIImage? {
|
|
|
|
+ // 确保有原始图片
|
|
|
|
+ guard let originalImage = uploadImageView.image else {
|
|
|
|
+ print("没有可处理的图片")
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 开始图像处理
|
|
|
|
+ UIGraphicsBeginImageContextWithOptions(originalImage.size, true, originalImage.scale)
|
|
|
|
+ defer { UIGraphicsEndImageContext() }
|
|
|
|
+
|
|
|
|
+ // 获取绘图上下文
|
|
|
|
+ guard let context = UIGraphicsGetCurrentContext() else {
|
|
|
|
+ print("无法创建图像上下文")
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 1. 绘制全黑背景
|
|
|
|
+ UIColor.black.setFill()
|
|
|
|
+ context.fill(CGRect(origin: .zero, size: originalImage.size))
|
|
|
|
+
|
|
|
|
+ // 2. 绘制白色涂鸦(从drawingImageView获取)
|
|
|
|
+ if let drawingImage = drawingImageView.image {
|
|
|
|
+ // 使用白色混合模式绘制涂鸦
|
|
|
|
+ context.saveGState()
|
|
|
|
+ context.setBlendMode(.normal)
|
|
|
|
+ context.interpolationQuality = .high
|
|
|
|
+
|
|
|
|
+ // 将涂鸦转换为白色
|
|
|
|
+ let tintedImage = drawingImage.tinted(with: .white)
|
|
|
|
+ tintedImage.draw(in: CGRect(origin: .zero, size: originalImage.size))
|
|
|
|
+ context.restoreGState()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 3. 获取处理后的图像
|
|
|
|
+ guard let processedImage = UIGraphicsGetImageFromCurrentImageContext() else {
|
|
|
|
+ print("无法生成处理后的图像")
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return processedImage
|
|
|
|
+// UIImageWriteToSavedPhotosAlbum(processedImage, nil, nil, nil)
|
|
|
|
+// let alert = UIAlertController(title: "Image Generated", message: "The combined image has been saved to your photos.", preferredStyle: .alert)
|
|
|
|
+// alert.addAction(UIAlertAction(title: "OK", style: .default))
|
|
|
|
+// present(alert, animated: true)
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// UIImage扩展 - 图像着色
|
|
|
|
+extension UIImage {
|
|
|
|
+ func tinted(with color: UIColor) -> UIImage {
|
|
|
|
+ UIGraphicsBeginImageContextWithOptions(size, false, scale)
|
|
|
|
+ defer { UIGraphicsEndImageContext() }
|
|
|
|
+
|
|
|
|
+ color.set()
|
|
|
|
+ withRenderingMode(.alwaysTemplate).draw(in: CGRect(origin: .zero, size: size))
|
|
|
|
+
|
|
|
|
+ return UIGraphicsGetImageFromCurrentImageContext() ?? self
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MARK: - 手势处理修复
|
|
|
|
+extension TSAIRemovePhotlVC: UIGestureRecognizerDelegate {
|
|
|
|
+ @objc private func handlePinch(_ gesture: UIPinchGestureRecognizer) {
|
|
|
|
+ switch gesture.state {
|
|
|
|
+ case .began:
|
|
|
|
+ // 重置手势缩放比例
|
|
|
|
+ gesture.scale = 1.0
|
|
|
|
+ break
|
|
|
|
+ case .changed:
|
|
|
|
+ // 计算带灵敏度控制的缩放比例
|
|
|
|
+ let scale = (gesture.scale - 1.0) * zoomSensitivity + 1.0
|
|
|
|
+
|
|
|
|
+ // 计算新的缩放比例
|
|
|
|
+ let currentScale = scrollView.zoomScale
|
|
|
|
+ var newScale = currentScale * scale
|
|
|
|
+
|
|
|
|
+ // 限制缩放范围
|
|
|
|
+ newScale = min(max(newScale, minZoomScale), maxZoomScale)
|
|
|
|
+
|
|
|
|
+ // 应用缩放
|
|
|
|
+ scrollView.setZoomScale(newScale, animated: false)
|
|
|
|
+
|
|
|
|
+ // 重置手势缩放比例
|
|
|
|
+ gesture.scale = 1.0
|
|
|
|
+ case .ended:
|
|
|
|
+
|
|
|
|
+ if scrollView.zoomScale < 1.0 {
|
|
|
|
+ scrollView.setZoomScale(1.0, animated: true)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @objc private func handleDrag(_ gesture: UIPanGestureRecognizer) {
|
|
|
|
+ guard scrollView.zoomScale > scrollView.minimumZoomScale else { return }
|
|
|
|
+
|
|
|
|
+ let translation = gesture.translation(in: scrollView)
|
|
|
|
+
|
|
|
|
+ if gesture.state == .changed {
|
|
|
|
+ // 计算新的contentOffset,限制在有效范围内
|
|
|
|
+ let newOffsetX = scrollView.contentOffset.x - translation.x
|
|
|
|
+ let newOffsetY = scrollView.contentOffset.y - translation.y
|
|
|
|
+
|
|
|
|
+ let maxOffsetX = scrollView.contentSize.width - scrollView.bounds.width
|
|
|
|
+ let maxOffsetY = scrollView.contentSize.height - scrollView.bounds.height
|
|
|
|
+
|
|
|
|
+ scrollView.contentOffset = CGPoint(
|
|
|
|
+ x: max(0, min(newOffsetX, maxOffsetX)),
|
|
|
|
+ y: max(0, min(newOffsetY, maxOffsetY))
|
|
|
|
+ )
|
|
|
|
+
|
|
|
|
+ gesture.setTranslation(.zero, in: scrollView)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
|
|
|
|
+ // 允许缩放手势和拖动手势同时识别
|
|
|
|
+ return true
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// MARK: - UIScrollViewDelegate
|
|
|
|
+extension TSAIRemovePhotlVC:UIScrollViewDelegate {
|
|
|
|
+ func viewForZooming(in scrollView: UIScrollView) -> UIView? {
|
|
|
|
+ return uploadImageBgView
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ func scrollViewDidZoom(_ scrollView: UIScrollView) {
|
|
|
|
+ // 缩放后调整图片位置
|
|
|
|
+ adjustImagePosition()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private func adjustImagePosition() {
|
|
|
|
+ let imageViewSize = uploadImageBgView.frame.size
|
|
|
|
+ let scrollViewSize = scrollView.bounds.size
|
|
|
|
+
|
|
|
|
+ let verticalPadding = max((scrollViewSize.height - imageViewSize.height) / 2, 0)
|
|
|
|
+ let horizontalPadding = max((scrollViewSize.width - imageViewSize.width) / 2, 0)
|
|
|
|
+ print("verticalPadding=\(verticalPadding),horizontalPadding=\(horizontalPadding)")
|
|
|
|
+ scrollView.contentInset = UIEdgeInsets(
|
|
|
|
+ top: verticalPadding,
|
|
|
|
+ left: horizontalPadding,
|
|
|
|
+ bottom: verticalPadding,
|
|
|
|
+ right: horizontalPadding
|
|
|
|
+ )
|
|
|
|
+ }
|
|
|
|
+}
|