代码之家  ›  专栏  ›  技术社区  ›  willd

将图像添加到UIVIew的子类

  •  0
  • willd  · 技术社区  · 2 年前

    我有一个UIViewController,在其中我将UIIView设置为子视图,以在其中保存UIImage

    class MyVIewController: UIViewController { 
    
      let myView = MyView()
    
         override func viewDidLoad() {
                super.viewDidLoad()
                myView.translatesAutoresizingMaskIntoConstraints =  false  
                myView.backgroundColor = .systemPink
               
                view.addSubview(myView)
    
        } 
    
      @objc func changeImageFunc(_ sender: Any) {
    
          //...extra code assigned .image (savedImage)
       myView.setImage(savedImage)
    
       }
    
    class MyView: UIView {
        
         var imageView: UIImageView
        
        override init(frame: CGRect) {
         
            
            imageView = UIImageView()
            super.init(frame: frame)
            
            addSubview(imageView)
    
        }
    
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
    
        }
        
        func setImage(_ image: UIImage) {
             // Set the image for the internal UIImageView
             imageView.image = image
         }
        
    }
    

    我试着把 imageView 直接在中的属性 chaneImageFunc 像这样

    myView.imageView.image = savedImage
    

    但也不起作用。如何显示保存在 myView 类到 MyViewController

    0 回复  |  直到 2 年前
        1
  •  2
  •   R4N    2 年前

    看起来您从未为UIImageView(或MyView)建立过任何自动布局约束。因此,我的猜测是,即使显示UIView的背景色,imageView的框架也为0高0宽。当运行应用程序时,在Xcode中使用“调试视图层次结构”选项时,您应该能够看到这一点。

    Debug View Hierarchy

    0 Size

    下面是一个调整代码以包括视图和imageView的自动布局约束的示例,这应该允许图像正确显示。

    编辑:以编程方式设置视图时,它们将默认使用自动调整遮罩(弹簧和支柱),并将其转换为自动布局约束。若要设置程序化自动布局约束而不使其与自动保留掩码冲突(转换为自动布局约束),您需要通过设置禁用将授权掩码转换为自动布置约束 translatesAutoresizingMaskIntoConstraints false 在目标视图上。

    class MyViewController: UIViewController {
        
        let myView = MyView()
        
    
        override func viewDidLoad() {
            super.viewDidLoad()
            super.viewDidLoad()
            myView.translatesAutoresizingMaskIntoConstraints =  false
            myView.backgroundColor = .systemPink
            
            view.addSubview(myView)
            myView.widthAnchor.constraint(equalToConstant: 50).isActive = true
            myView.heightAnchor.constraint(equalToConstant: 50).isActive = true
            myView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            myView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        }
        
        @IBAction @objc func changeImageFunc(_ sender: Any) {
            // just an example image
            let image = UIImage(systemName: "eraser")!
            myView.setImage(image)
        }
        
    }
    
    import UIKit
    
    class MyView: UIView {
    
        var imageView: UIImageView
        
        override init(frame: CGRect) {
         
            
            imageView = UIImageView()
            imageView.translatesAutoresizingMaskIntoConstraints = false
            super.init(frame: frame)
            
            addSubview(imageView)
            imageView.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true
            imageView.heightAnchor.constraint(equalTo: self.heightAnchor).isActive = true
            imageView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
            imageView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        func setImage(_ image: UIImage) {
             // Set the image for the internal UIImageView
             imageView.image = image
         }
    
    }
    

    结果是:

    ImageView example

    推荐文章