ios - 如何在缩放 imageView 时防止缩放 parantView

标签 ios swift uiscrollview uiimageview zooming

我创建了包含 ScrollView 的 CustomeView。在 ScrollView 中,有一个包含 ImageView 和两个按钮(确定和取消)的容器 View 。

以下是我的 View 层次结构。 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)

最佳答案

您的其他组件是放大-缩小,因为您将这些组件放在 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)
        }
    }
}

关于ios - 如何在缩放 imageView 时防止缩放 parantView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53004949/

相关文章:

swift - NSCollectionViewItems 在更新数据并调用 NSCollectionView.reloadData() 后呈现不正确

ios - 像 Facebook 或 Safari 一样折叠 UINavigationBar?

ios - 可重复使用的表格 View 单元格中的 UIButton 图像切换问题

ios - 无法让我的标题在 swift 4 中显示在我的 UIcollectionView 页面上

ios - 密码错误的登录按钮转到下一个 View

objective-c - UITableView iOS11 不滚动 - XCode 9

ios - 如何以编程方式将 ScrollView 设置到初始位置 (Swift)

iphone - 自动选择选择器行

swift - 检查数组中的素数

ios - 如何在 Watchkit 中的 GlanceController 和 InterfaceController 之间进行通信?