为什么不能在 UIImageView 上使用右、左、宽、高?

why won't right, left, width, height work on UIImageView?

我正在学习一个消息聊天应用程序的教程,但我在 UIImageViews 上不断收到错误消息。例如 ~ userImageView.right、userImageView.width 等都会出现 UIImageView 没有成员的错误。我在我的应用程序的其他部分使用了 right/width/height,我不明白为什么它在这里不开心...想法?

class ConversationTableViewCell: UITableViewCell {

static let identifier = "ConversationTableViewCell"

private let userImageView: UIImageView = {
    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFill
    imageView.layer.cornerRadius = 50
    imageView.layer.masksToBounds = true
    return imageView
}()

private let userNameLabel: UILabel = {
    let label = UILabel()
    label.font = .systemFont(ofSize: 21, weight: .semibold)
    return label
}()

private let userMessageLabel: UILabel = {
    let label = UILabel()
    label.font = .systemFont(ofSize: 19, weight: .regular)
    label.numberOfLines = 0
    return label
}()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    contentView.addSubview(userImageView)
    contentView.addSubview(userNameLabel)
    contentView.addSubview(userMessageLabel)
}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func layoutSubviews() {
    super.layoutSubviews()

    userImageView.frame = CGRect(x: 10,
                                 y: 10,
                                 width: 100,
                                 height: 100)

    userNameLabel.frame = CGRect(x: userImageView.right + 10,
                                 y: 10,
                                 width: contentView.width - 20 - userImageView.width,
                                 height: (contentView.height-20)/2)

    userMessageLabel.frame = CGRect(x: userImageView.right + 10,
                                    y: userNameLabel.bottom + 10,
                                    width: contentView.width - 20 - userImageView.width,
                                    height: (contentView.height-20)/2)

}

一个UIImageView是一个UIView对象。因此它有一个框架 属性,这是一个 CGRect.

您可以使用 someImageView.frame 到达视图的框架。

CGRect 具有属性 size.heightsize.width。它们还有 maxXmaxY 等价于 rightbottom 的属性。 (实际上,CGRect 似乎也有属性 heightwidth,所以你可以跳过“size.”前缀。)

所以对于 imageView someImageView:

height = someImageView.frame.height 
width = someImageView.frame.width
right = someImageView.frame.maxX
bottom = someImageView.frame.maxY

如果你愿意,你可以向 UIView 添加一个扩展,添加属性高度、宽度、右侧和底部,如@afaq 的回答。 (已投票)

创建一个新的 swift 文件并在其中添加以下代码,一切都会顺利进行。

extension UIView {
    public var width: CGFloat {
        return frame.size.width
    }
    
    public var height: CGFloat {
        return frame.size.height
    }
    
    public var top: CGFloat {
        return frame.origin.y
    }

    public var left: CGFloat {
        return frame.origin.x
    }

    public var bottom: CGFloat {
        return top + height
    }

    public var right: CGFloat {
        return left + width
    }
}

或:

将此包 AATools 导入项目的更简单方法,它包含许多便于快速开发的扩展。