【问题标题】:UIImageView zoom and pinch in UIScrollViewUIImageView 在 UIScrollView 中缩放和捏合
【发布时间】:2017-09-23 07:17:41
【问题描述】:

我尝试了许多不同的方法来实现扩展图像和捏拉缩放。我找到了有关如何使用项目中保存的图像执行此操作的教程,但是我正在从 Firebase 检索我的图像。我希望一张图片占据 ProfileViewController 屏幕的一半左右,而其他图片能够扩展整页并且能够缩放。我现在拥有的代码可以做到这一点,但是缩放和位置不干净或易于使用。

var newImageView: UIImageView!



@IBAction func imageTapped(_ sender: UITapGestureRecognizer)  {
    let imageView = sender.view as! UIImageView

    let scrollView = UIScrollView(frame: self.view.frame)


    newImageView = UIImageView(image: imageView.image)
    newImageView.frame = self.view.frame
    newImageView.backgroundColor = .black
    newImageView.contentMode = .top
    newImageView.isUserInteractionEnabled = true


    let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
    scrollView.addGestureRecognizer(tap)


    scrollView.delegate = self
    scrollView.minimumZoomScale = 1.0
    scrollView.maximumZoomScale = 3.0

    scrollView.addSubview(newImageView)

    self.view.addSubview(scrollView)
}

func viewForZooming(in scrollView: UIScrollView) -> UIView?
{
    return newImageView;
}

func dismissFullscreenImage(_ sender: UITapGestureRecognizer) {
    sender.view?.removeFromSuperview()
}

【问题讨论】:

  • 截图有什么问题 截图有很多问题。
  • @KKRocks 我还没有设计,我只是专注于如何让每张图片在点击时展开,并且在它已经展开后也能够正确缩放。
  • 那你想做什么?
  • @KKRocks 找到一种更有效的方式来显示图像,当我单击图像时,视图和框架完全关闭。
  • 使用这个库来缩放 imageView : github.com/jaredsinclair/JTSImageViewController

标签: ios swift xcode uiscrollview uiimageview


【解决方案1】:

这是我正在以编程方式创建滚动视图和图像视图,这里 imgPHAsset,我正在从图库中选择图像。

在这里,选择一个图像并移动到其他视图控制器,然后根据我的图像视图调整该图像的大小 因此图像在缩放后不会模糊。

最小缩放受限于 imageview,最大缩放为 4.0。

func singleVC1()  {
        let v = UIView(frame: CGRect(x: 40, y: 50, width: self.view.frame.size.width - 80, height: view.frame.size.height - 200))
        let view1 = UIView(frame: CGRect(x: 0, y: 0, width: v.frame.size.width, height: v.frame.size.height/2 - 1))
        let scroll1 = UIScrollView.init(frame: view1.bounds)
        let imgview = UIImageView.init(frame: (CGRect)(origin: CGPoint.zero, size: self.returnAspectSize(targetWidth: view.frame.size.width, img: img)))
        self.setZoomScale(scrollview: scroll1, imageview: imgview)
        imgview.image = self.getUIImage(asset: img)
        scroll1.maximumZoomScale = 4.0;
        scroll1.delegate = self;
        scroll1.bounces = false
        scroll1.contentSize =  imgview.frame.size
        scroll1.addSubview(imgview)
        view1.layer.borderColor = UIColor.red.cgColor
        view1.layer.borderWidth = 5.0
        view1.addSubview(scroll1)
        v.addSubview(view1)

        let view2 = UIView(frame: CGRect(x: 0, y: v.frame.size.height/2+1, width: v.frame.size.width, height: v.frame.size.height/2 - 1))
        let scroll2 = UIScrollView.init(frame: view2.bounds)
        let imgview1 = UIImageView.init(frame: (CGRect)(origin: CGPoint.zero, size: self.returnAspectSize(targetWidth: view.frame.size.width, img: img)))
        imgview1.image = self.getUIImage(asset: img)
        self.setZoomScale(scrollview: scroll2, imageview: imgview1)
        scroll2.bounces = false

        scroll2.maximumZoomScale = 4.0;
        scroll2.delegate = self;
        view2.layer.borderColor = UIColor.red.cgColor
        view2.layer.borderWidth = 5.0
        scroll2.contentSize = imgview1.frame.size
        scroll2.addSubview(imgview1)
        view2.addSubview(scroll2)
        v.addSubview(view2)
        self.view.addSubview(v)
    }
func setZoomScale(scrollview : UIScrollView, imageview : UIImageView) {
        var minZoom = min(self.view.bounds.size.width / imageview.bounds.size.width, self.view.bounds.size.height / imageview.bounds.size.height);

        if (minZoom > 1.0) {
            minZoom = 1.0;
        }
        scrollview.minimumZoomScale = minZoom;
        scrollview.zoomScale = minZoom;
    }
    func returnAspectSize(targetWidth : CGFloat, img : PHAsset) -> CGSize {
        let img1 = self.getUIImage(asset: self.img)
        let targetwidth = targetWidth
        let scalefactor = (CGFloat)(targetwidth) / (CGFloat)((img1?.size.width)!)
        let targetheight = (img1?.size.height)! * scalefactor
        let targesize = CGSize(width: (CGFloat)(targetwidth), height: targetheight)
        return targesize
    }

试试这个。我相信这会对你有所帮助。

【讨论】:

  • 我应该将它放入我的 imageTapped 手势识别器功能中吗?
  • 表示你想做什么?这工作正常吗? @hghg
  • 我想将它添加到每张图片中,有些配置文件可能只有 2-3 张图片
  • 看来您必须为添加到滚动视图中的所有图像添加 scoll,以便根据我的回答您可以为其计算帧并尽可能多地添加图像视图
  • 我可以把我的项目发给你,让你更好地理解我的意思吗?
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2012-02-12
  • 2014-02-16
  • 2015-07-12
  • 2019-11-13
  • 2023-04-11
相关资源
最近更新 更多