ios - 缩放超过 ImageView 边界

标签 ios swift

我一直在关注一篇展示如何重现 Instagram 缩放图片的文章。它工作正常,但是当我缩放时,图像不会超出 ImageView 的边界。正如您在屏幕截图中看到的那样,这看起来很奇怪,我希望它像在 Instagram 上一样,如果需要,图像可以缩放到整个屏幕,并在释放时快速返回(已经可以正常工作)。

screenshot

有谁知道我该怎么做?下面是捏合和平移功能。 提前致谢

@objc func pan(sender: UIPanGestureRecognizer) {

    if self.isZooming && sender.state == .began {
        self.originalImageCenter = sender.view?.center
    } else if self.isZooming && 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.imageView.superview)
    }
}

@objc func pinch(sender:UIPinchGestureRecognizer) {
    NotificationCenter.default.post(name: Notification.Name(rawValue: "disablePage"), object: nil)

    if sender.state == .began {
        let currentScale = self.imageView.frame.size.width / self.imageView.bounds.size.width
        let newScale = currentScale*sender.scale
        if newScale > 1 {
            self.isZooming = 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.imageView.frame.size.width / self.imageView.bounds.size.width
        var newScale = currentScale*sender.scale
        if newScale < 1 {
            newScale = 1
            let transform = CGAffineTransform(scaleX: newScale, y: newScale)
            self.imageView.transform = transform
            sender.scale = 1
        }else {
            view.transform = transform
            sender.scale = 1
        }
    } else if sender.state == .ended || sender.state == .failed || sender.state == .cancelled {
        guard let center = self.originalImageCenter else {return}
        UIView.animate(withDuration: 0.3, animations: {
            self.imageView.transform = CGAffineTransform.identity
            self.imageView.center = center
        }, completion: { _ in
            self.isZooming = false

            NotificationCenter.default.post(name: Notification.Name(rawValue: "enablePage"), object: nil)

        })
    }
}


 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

最佳答案

听起来你只想设置 .clipsToBounds为 false,在代码中或在 Interface Builder 中有一个复选框。

关于ios - 缩放超过 ImageView 边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56681515/

相关文章:

ios - 保存和读取登录到钥匙串(keychain)不工作 IOS swift

ios - 在 Swift 中设置默认配置文件图片问题(iOS)

objective-c - 如何填充数组并同时查看其数据 - Swift - IOS9

ios - 改变 UITableViewCell 高度的自定义动画

ios - 如何使用一对多关系

ios - 重命名 xcode 项目

ios - 以编程方式自动布局不起作用

swift tableview如何选择所有行

ios - 唯一性约束功能需要 ios 部署目标 9.0 或更高版本 - 核心数据

ios - Swift 3,成功传递数据但var在使用时返回nil