【问题标题】:how to prevent zooming of parantView while zooming of imageView如何在缩放 imageView 时防止缩放 parantView
【发布时间】:2019-03-30 23:47:28
【问题描述】:

我创建了包含 Scroll-view.inside 滚动视图的 CustomeView,其中有一个包含图像视图的容器视图和两个按钮(确定和取消)。

以下是我的视图层次结构。 CustomeView -> ScrollView -> ContainerView -> (imageView + OtherComponent).

我面临两个问题。

  1. 在缩小 imageview 时,CustomeView 也用 相对于 Scrollview。
  2. 其他组件位置在放大时发生变化。

    class cameraPreview : UIView , UIScrollViewDelegate {
    
    var selectedImage : UIImage!
    var backGroundView = UIView()
    var imageScrollview = UIScrollView()
    var metaData : [String:Any]?
    
    let backgroundImageView  = UIImageView()
    var closeButton : UIButton = {
        let button = UIButton(type: UIButtonType.custom)
        button.setImage(UIImage(named:"closeWhite"), for: .normal)
        button.addTarget(self, action: #selector(closeClick), for: .touchUpInside)
        return button
    }()
    
    
    var okButton : UIButton = {
        let button = UIButton()
        button.setTitle("OK", for: .normal)
        button.titleLabel?.font = UIFont.systemFont(ofSize: 15)
        button.setTitleColor(UIColor.black, for: .normal)
        button.backgroundColor = UIColor.white
        button.layer.cornerRadius = 15
        button.addTarget(self, action: #selector(okClick), for: .touchUpInside)
        return button
    }()
    
    
    
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commoninit()
    }
    
    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commoninit()
    }
    
    
    required init(image:UIImage,frame:CGRect,metaData:[String:Any]?) {
        super.init(frame: frame)
        self.selectedImage = image
        self.metaData = metaData
        commoninit()
    }
    
    override func layoutSubviews() {
    
    
    }
    
    
    func commoninit() {
    
        backGroundView.backgroundColor = UIColor.white
        backgroundImageView.contentMode = .scaleAspectFit
    
        self.addSubview(imageScrollview)
        imageScrollview.addSubview(backGroundView)
        backGroundView.addSubview(backgroundImageView)
        backGroundView.addSubview(closeButton)
        backGroundView.addSubview(okButton)
    
    
    
    
        imageScrollview.snp.makeConstraints { (make) in
            make.edges.equalTo(self)
        }
        backGroundView.snp.makeConstraints { (make) in
                    make.edges.equalTo(imageScrollview)
                    make.height.width.equalTo(self)
        }
    
        backgroundImageView.snp.makeConstraints { (make) in
            make.edges.equalTo(backGroundView)
        }
        okButton.snp.makeConstraints { (make) in
            make.width.equalTo(80)
            make.height.equalTo(30)
            make.centerX.equalTo(backGroundView.snp.centerX)
            make.bottom.equalTo(backGroundView).offset(-20)
        }
    
    
    
        closeButton.snp.makeConstraints { (make) in
            make.width.height.equalTo(30)
            make.left.equalTo(20)
            make.top.equalTo(10)
        }
    
        backgroundImageView.image = selectedImage
        imageScrollview.delegate = self
        imageScrollview.minimumZoomScale = 1.0
        imageScrollview.maximumZoomScale = 6.0
    }
    
    
    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return backgroundImageView
    }
    
    @objc func closeClick(sender:UIButton) {
        self.removeFromSuperview()
    }
    
    @objc func okClick(sender:UIButton) {
        if let topCotroller = UIApplication.shared.gettopMostViewController() {
            self.removeFromSuperview()
            let mediaDetailController = UploadDetailsViewController.instantiate(fromAppStoryboard: .Upload)
            mediaDetailController.mediaImage = selectedImage
            if metaData != nil {
                mediaDetailController.exifDictionary = metaData![kCGImagePropertyExifDictionary as String] as? [String : AnyObject]
            }
            topCotroller.navigationController?.pushViewController(mediaDetailController, animated: true)
        }
    }
    

    }

以下是在当前 ControllerView 中添加 cameraPreview 的代码

let imagePreview = cameraPreview(image: image, frame: UIScreen.main.bounds,metaData:metaData)
         self.view.addSubview(imagePreview)

【问题讨论】:

    标签: ios swift uiscrollview uiimageview zooming


    【解决方案1】:

    您的其他组件正在放大,因为您将这些组件放在 ScrollView 中。如果您只是将这些组件放在 ScrollView 之外,那么您的组件将不会相对于 ScrollView 放大。

    以下是源代码。

    class cameraPreview : UIView , UIScrollViewDelegate {
    
        var selectedImage : UIImage!
        var backGroundView = UIView()
        var imageScrollview = UIScrollView()
        var metaData : [String:Any]?
    
        let backgroundImageView  = UIImageView()
        var closeButton : UIButton = {
            let button = UIButton(type: UIButtonType.custom)
            button.setImage(UIImage(named:"closeWhite"), for: .normal)
            button.addTarget(self, action: #selector(closeClick), for: .touchUpInside)
            return button
        }()
    
    
        var okButton : UIButton = {
            let button = UIButton()
            button.setTitle("OK", for: .normal)
            button.titleLabel?.font = UIFont.systemFont(ofSize: 15)
            button.setTitleColor(UIColor.black, for: .normal)
            button.backgroundColor = UIColor.white
            button.layer.cornerRadius = 15
            button.addTarget(self, action: #selector(okClick), for: .touchUpInside)
            return button
        }()
    
    
    
    
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            commoninit()
        }
    
        required public init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            commoninit()
        }
    
    
        required init(image:UIImage,frame:CGRect,metaData:[String:Any]?) {
            super.init(frame: frame)
            self.selectedImage = image
            self.metaData = metaData
            commoninit()
        }
    
        override func layoutSubviews() {
    
    
        }
    
    
        func commoninit() {
            self.backgroundColor = UIColor.white
            backGroundView.backgroundColor = UIColor.clear
            backgroundImageView.contentMode = .scaleAspectFit
    
            self.addSubview(imageScrollview)
            imageScrollview.addSubview(backGroundView)
            backGroundView.addSubview(backgroundImageView)
            self.addSubview(closeButton)
            self.addSubview(okButton)
    
    
    
    
            imageScrollview.snp.makeConstraints { (make) in
                make.edges.equalTo(self)
            }
            backGroundView.snp.makeConstraints { (make) in
                make.edges.equalTo(imageScrollview)
                make.height.width.equalTo(self)
            }
    
            backgroundImageView.snp.makeConstraints { (make) in
                make.edges.equalTo(backGroundView)
            }
            okButton.snp.makeConstraints { (make) in
                make.width.equalTo(80)
                make.height.equalTo(30)
                make.centerX.equalTo(self)
                make.bottom.equalTo(self).offset(-20)
            }
    
    
    
            closeButton.snp.makeConstraints { (make) in
                make.width.height.equalTo(30)
                make.left.equalTo(20)
                make.top.equalTo(10)
            }
    
            backgroundImageView.image = selectedImage
            imageScrollview.delegate = self
            imageScrollview.minimumZoomScale = 1.0
            imageScrollview.maximumZoomScale = 6.0
        }
    
    
        func viewForZooming(in scrollView: UIScrollView) -> UIView? {
            return backgroundImageView
        }
    
        @objc func closeClick(sender:UIButton) {
            self.removeFromSuperview()
        }
    
        @objc func okClick(sender:UIButton) {
            if let topCotroller = UIApplication.shared.gettopMostViewController() {
                self.removeFromSuperview()
                let mediaDetailController = UploadDetailsViewController.instantiate(fromAppStoryboard: .Upload)
                mediaDetailController.mediaImage = selectedImage
                if metaData != nil {
                    mediaDetailController.exifDictionary = metaData![kCGImagePropertyExifDictionary as String] as? [String : AnyObject]
                }
                topCotroller.navigationController?.pushViewController(mediaDetailController, animated: true)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      相关资源
      最近更新 更多