为什么不能在 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.height
和 size.width
。它们还有 maxX
和 maxY
等价于 right
和 bottom
的属性。 (实际上,CGRect
似乎也有属性 height
和 width
,所以你可以跳过“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 导入项目的更简单方法,它包含许多便于快速开发的扩展。
我正在学习一个消息聊天应用程序的教程,但我在 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.height
和 size.width
。它们还有 maxX
和 maxY
等价于 right
和 bottom
的属性。 (实际上,CGRect
似乎也有属性 height
和 width
,所以你可以跳过“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 导入项目的更简单方法,它包含许多便于快速开发的扩展。