【问题标题】:Swift - image zoom in/out inside a table viewSwift - 在表格视图中放大/缩小图像
【发布时间】:2022-01-03 06:25:56
【问题描述】:

我正在尝试复制我们在 IG 中发现的图像放大/缩小功能,我遇到的唯一问题是当我放大图像时没有覆盖整个屏幕,它只会放大单元格内部。这是一个常规设置、一个表格视图、一个单元格、一个图像视图和一个标签。我不确定我在这里缺少什么。非常感谢任何帮助:

视图控制器

import UIKit

class ViewController: UIViewController, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView!
    
    var picArray = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.dataSource = self
        tableView.delegate = self
        
        tableView.rowHeight = 300
    }
}

extension ViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return picArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! cell
        
        let data = picArray[indexPath.item]
        cell.backgroundColor = .red
        cell.setupCell(image: data)
        cell.clipsToBounds = false
        cell.selectionStyle = .none
        
        return cell
        
    }

}

细胞类

import UIKit

class cell: UITableViewCell, UIScrollViewDelegate {
    
    
    @IBOutlet var picture: UIImageView!
    @IBOutlet var caption: UILabel!
    
    var zoomEnabled = false
    var imgCenter:CGPoint?
    
    override func awakeFromNib() {
        super.awakeFromNib()
       
        picture.contentMode = .scaleAspectFill
        picture.isUserInteractionEnabled = true
        picture.clipsToBounds = false
        
        caption.layer.zPosition = -1
        
        let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinch(sender:)))
        pinch.delegate = self
        self.picture.addGestureRecognizer(pinch)
        
        let pan = UIPanGestureRecognizer(target: self, action: #selector(self.pan(sender:)))
        pan.delegate = self
        self.picture.addGestureRecognizer(pan)
        
    }
    
    override func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
    
    @objc func pan(sender: UIPanGestureRecognizer) {
        if self.zoomEnabled && sender.state == .began {
            self.imgCenter = sender.view?.center
        } else if self.zoomEnabled && sender.state == .changed {
            let translation = sender.translation(in: self)
            if let view = sender.view {
                view.center = CGPoint(x:view.center.x + translation.x,
                                      y:view.center.y + translation.y)
            }
            sender.setTranslation(CGPoint.zero, in: self.picture.superview)
        }
    }
    
    @objc func pinch(sender: UIPinchGestureRecognizer) {
        if sender.state == .began {
            let currentScale = self.picture.frame.size.width / self.picture.bounds.size.width
            let newScale = currentScale * sender.scale
            if newScale > 1 {
                self.zoomEnabled = true
            }
        } else if sender.state == .changed {
            guard let view = sender.view else {return}
            let pinchCenter = CGPoint(x: sender.location(in: view).x - view.bounds.midX,
                                      y: sender.location(in: view).y - view.bounds.midY)
            let transform = view.transform.translatedBy(x: pinchCenter.x, y: pinchCenter.y)
                .scaledBy(x: sender.scale, y: sender.scale)
                .translatedBy(x: -pinchCenter.x, y: -pinchCenter.y)
            let currentScale = self.picture.frame.size.width / self.picture.bounds.size.width
            var newScale = currentScale * sender.scale
            if newScale < 1 {
                newScale = 1
                let transform = CGAffineTransform(scaleX: newScale, y: newScale)
                self.picture.transform = transform
                sender.scale = 1
            }else {
                view.transform = transform
                sender.scale = 1
            }
        } else if sender.state == .ended {
            guard let center = self.imgCenter else {return}
            UIView.animate(withDuration: 0.3, animations: {
                self.picture.transform = CGAffineTransform.identity
                self.picture.center = center
            }, completion: { _ in
                self.zoomEnabled = false
            })
        }
    }
    
    func setupCell(image: String) {
        if let image : UIImage = UIImage(named: image) {
            picture.image = image
        }
    }
    
}

  

【问题讨论】:

    标签: ios swift uitableview pinchzoom


    【解决方案1】:

    对于图像捏缩放,你需要捏手势,

    你可以使用 UIScrollView 来捏缩放效果

    请观看此视频

    https://www.youtube.com/watch?v=GtYryiZ9yTw

    【讨论】:

    • 感谢您的评论。我正在使用捏合手势,YouTube 视频用于不同的设置。
    • 什么时候可以用简单的方法来做。为什么要以复杂的方式麻烦......但是好吧......随便......
    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2011-08-22
    • 2019-04-23
    相关资源
    最近更新 更多