ios 无法通过CGRect定位UIImage

pxq42qpu  于 2023-05-30  发布在  iOS
关注(0)|答案(2)|浏览(123)

我试图建立一个UIView的社交媒体用户的个人资料和得到卡住的权利在一开始-当添加一个用户图像(UIImage)到我的UIView。下面是我尝试使用的代码:

import UIKit

class ProfileHeaderView: UIView {
    
    private lazy var profileImage: UIImageView = {
        let imageView = UIImageView(image: UIImage(named: "hipsterCat"))
        
        // Making Image Round
        imageView.layer.cornerRadius = imageView.frame.size.width / 2
        imageView.clipsToBounds = true
        
        imageView.layer.borderColor = UIColor.white.cgColor
        imageView.layer.borderWidth = 3
                
        return imageView
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupView()
    }
    
    private func setupView() {
        backgroundColor = .lightGray
        addSubview(profileImage)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        profileImage.frame = CGRect(
            x: bounds.midX - 64,
            y: bounds.midY - 64,
            width: 128,
            height: 128
        )
    }
}

我的任务是使用CGRect在superView上定位UIImage,但是一旦我运行项目,它就不会出现在屏幕上(只有浅灰色的背景)。
UIImageView没问题,在注解layoutSubviews()覆盖时出现图像,但没有定位。

xnifntxz

xnifntxz1#

有很多事情可能会出错。你看到的最奇怪的结果是,一旦调整了大小,你根本看不到图像。
我最好的猜测是,您也在为ProfileHeaderView示例设置框架。请注意,有2个API用于郊游;一个是使用frame,另一个是自动布局。在自动布局中,将调用一个方法layoutSubviews。但是使用frame,则只能调用frame。所以你可能错过了另一个超驰器。
尝试添加以下内容:

override var frame: CGRect {
    didSet {
        updateImagePosition()
    }
}

override func layoutSubviews() {
    super.layoutSubviews()
    
    updateImagePosition()
}

private func updateImagePosition() {
    profileImage.contentMode = .scaleAspectFit
    profileImage.frame = CGRect(
        x: bounds.midX - 64,
        y: bounds.midY - 64,
        width: 128,
        height: 128
    )
    profileImage.layer.cornerRadius = 64
}

除了添加框架覆盖之外,我还添加了选项来确定视图的内容模式。您可能想将其移动到您的设置方法中,但如果它留在这里也不算太坏。另一个是设置拐角半径,这肯定需要在这里设置。这两个都是@HangarRash的。
最后,为了公平起见,最好有以下这样的东西:

@IBDesignable
class ProfileHeaderView: UIView {
    
    @IBInspectable
    private var imageName: String = "hipsterCat" {
        didSet {
            profileImage.image = UIImage(named: imageName)
        }
    }
    @IBInspectable
    private var imageRadius: CGFloat = 64 {
        didSet {
            updateImagePosition()
        }
    }
    
    private lazy var profileImage: UIImageView = {
        let imageView = UIImageView(image: UIImage(named: imageName))
        imageView.contentMode = .scaleAspectFit
        imageView.clipsToBounds = true
        imageView.layer.borderColor = UIColor.white.cgColor
        imageView.layer.borderWidth = 3
        return imageView
    }()
    
    override var frame: CGRect {
        didSet {
            updateImagePosition()
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupView()
    }
    
    private func setupView() {
        backgroundColor = .lightGray
        addSubview(profileImage)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        updateImagePosition()
    }
    
    private func updateImagePosition() {
        profileImage.frame = CGRect(
            x: bounds.midX - imageRadius,
            y: bounds.midY - imageRadius,
            width: imageRadius*2.0,
            height: imageRadius*2.0
        )
        profileImage.layer.cornerRadius = imageRadius
    }
}
iih3973s

iih3973s2#

我从评论中遵循@HangarRash的建议,并设法解决了这个问题。我做的事情是在layoutSubViews中设置角半径(并使图像变圆),同时将.scaleAspectFill添加到UIImageView。最后的代码是:

import UIKit

class ProfileHeaderView: UIView {
    
    private lazy var profileImage: UIImageView = {
        let imageView = UIImageView(image: UIImage(named: "hipsterCat"))
        imageView.contentMode = .scaleAspectFit
        
        return imageView
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupView()
    }
    
    private func setupView() {
        backgroundColor = .lightGray
        addSubview(profileImage)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        profileImage.frame = CGRect(
            x: bounds.minX + 16,
            y: bounds.minY + 16,
            width: 128,
            height: 128
        )
        
        //Making image round
        profileImage.layer.cornerRadius = profileImage.frame.size.width / 2
        profileImage.clipsToBounds = true
        
        profileImage.layer.borderColor = UIColor.white.cgColor
        profileImage.layer.borderWidth = 3
    }
}

相关问题