Ios 试图确定子类UICollectionViewCell中的单元格宽度
我有一个基本的子类UICollectionView单元。我想给它添加一个UIImageView,这样每个单元格都会显示一个图像 如果我将显式值添加到x:y:width:height,则图像显示正确,但我不能使用Ios 试图确定子类UICollectionViewCell中的单元格宽度,ios,swift,uicollectionview,uicollectionviewcell,Ios,Swift,Uicollectionview,Uicollectionviewcell,我有一个基本的子类UICollectionView单元。我想给它添加一个UIImageView,这样每个单元格都会显示一个图像 如果我将显式值添加到x:y:width:height,则图像显示正确,但我不能使用self.contentView.frame.width来确定集合视图单元格的大小(用于将图像放置在x轴上) 在上面的示例中,(self.contentView.frame.width-10.0)没有获取集合视图单元格的大小,因此图像根本不显示。如果我显式地为x输入一个值,比如0,它会显示
self.contentView.frame.width
来确定集合视图单元格的大小(用于将图像放置在x轴上)
在上面的示例中,(self.contentView.frame.width-10.0)
没有获取集合视图单元格的大小,因此图像根本不显示。如果我显式地为x输入一个值,比如0,它会显示
如何确定子类集合视图单元格的大小(宽度)?在视图生命周期的早期调用初始值设定项以准确提供维度值 更惯用的方法是在
layoutSubviews
生命周期方法中布局图像。下面是一个简单的例子
class SubclassedCell: UICollectionViewCell {
var myImageView: UIImageView!
var imageDisplayed = false
override func layoutSubviews() {
super.layoutSubviews()
if !imageDisplayed {
myImageView = UIImageView(frame: CGRect(x: (self.frame.width - 10.0), y: 50.0, width: 20.0, height: 20.0))
myImageView.image = UIImage(named: "JustinBieber")
self.contentView.addSubview(myImageView)
imageDisplayed = true
}
}
}
如果你在你的应用程序中使用自动布局,你也可以考虑添加图像和提供约束,而不是显式地设置图像的帧。p>
如本文所示——取决于您的用例——它们可能是设置您的计算单元的更好方法 在视图生命周期的早期调用初始值设定项以准确提供维度值 更惯用的方法是在
layoutSubviews
生命周期方法中布局图像。下面是一个简单的例子
class SubclassedCell: UICollectionViewCell {
var myImageView: UIImageView!
var imageDisplayed = false
override func layoutSubviews() {
super.layoutSubviews()
if !imageDisplayed {
myImageView = UIImageView(frame: CGRect(x: (self.frame.width - 10.0), y: 50.0, width: 20.0, height: 20.0))
myImageView.image = UIImage(named: "JustinBieber")
self.contentView.addSubview(myImageView)
imageDisplayed = true
}
}
}
如果你在你的应用程序中使用自动布局,你也可以考虑添加图像和提供约束,而不是显式地设置图像的帧。p>
如本文所示——取决于您的用例——它们可能是设置您的计算单元的更好方法 实现这种布局的方法有很多,但有一些限制,您不需要知道宽度。定义所需的关系,布局系统管理其余关系
class SubclassedCell1: UICollectionViewCell {
var myImageView: UIImageView!
private func commonInit() {
myImageView = UIImageView()
myImageView.image = UIImage(named: "JustinBieber")
myImageView.translatesAutoresizingMaskIntoConstraints = false
self.contentView.addSubview(myImageView)
NSLayoutConstraint.activate([
myImageView.widthAnchor.constraint(equalToConstant: 20),
myImageView.heightAnchor.constraint(equalToConstant: 20),
myImageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 50),
myImageView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 10),
])
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder:aDecoder)
commonInit()
}
}
您还可以使用layoutsubview,如@syllatix所述。执行此操作时,请确保每次调用layoutSubviews时都更新框架,否则如果调整了视图的大小,视图将无法正确更新。在布置子视图时,也使用父视图边界,而不是框架
class SubclassedCell2: UICollectionViewCell {
var myImageView: UIImageView!
private func commonInit() {
myImageView = UIImageView()
myImageView.image = UIImage(named: "JustinBieber")
self.contentView.addSubview(myImageView)
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder:aDecoder)
commonInit()
}
override func layoutSubviews() {
super.layoutSubviews()
myImageView.frame = CGRect(x: (self.bounds.maxX - 10.0), y: 50.0, width: 20.0, height: 20.0)
}
}
有很多方法可以实现这种布局,但不需要知道宽度。定义所需的关系,布局系统管理其余关系
class SubclassedCell1: UICollectionViewCell {
var myImageView: UIImageView!
private func commonInit() {
myImageView = UIImageView()
myImageView.image = UIImage(named: "JustinBieber")
myImageView.translatesAutoresizingMaskIntoConstraints = false
self.contentView.addSubview(myImageView)
NSLayoutConstraint.activate([
myImageView.widthAnchor.constraint(equalToConstant: 20),
myImageView.heightAnchor.constraint(equalToConstant: 20),
myImageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 50),
myImageView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 10),
])
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder:aDecoder)
commonInit()
}
}
您还可以使用layoutsubview,如@syllatix所述。执行此操作时,请确保每次调用layoutSubviews时都更新框架,否则如果调整了视图的大小,视图将无法正确更新。在布置子视图时,也使用父视图边界,而不是框架
class SubclassedCell2: UICollectionViewCell {
var myImageView: UIImageView!
private func commonInit() {
myImageView = UIImageView()
myImageView.image = UIImage(named: "JustinBieber")
self.contentView.addSubview(myImageView)
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder:aDecoder)
commonInit()
}
override func layoutSubviews() {
super.layoutSubviews()
myImageView.frame = CGRect(x: (self.bounds.maxX - 10.0), y: 50.0, width: 20.0, height: 20.0)
}
}
需要注意的是,
layoutSubviews
在视图的生命周期中可以被多次调用感谢您的帮助,但是像@sooper提到的那样,layoutSubviews会被多次调用,因此,这使得细胞基本上到处喷出图像。@乔-我已经修改了这个例子,在最初调用“代码”> LayOutSubVIEW/COD>时,只向视图中添加了一个图像。有很多方法可以完成你要做的事情。lifecyclep.s-属性名称中的键入:var imageDispalyed=false(我尝试过编辑它,但编辑需要6个字符)您是否尝试过将逻辑放置在awakeFromNib
中?请注意,layoutSubviews
可以在视图的生命周期中多次调用感谢您的帮助,但就像@sooper提到的一样,LayoutSubview会被调用多次,因此,这使得细胞基本上到处喷出图像。@乔-我已经修改了这个例子,在最初调用“代码”> LayOutSubVIEW/COD>时,只向视图中添加了一个图像。有很多方法可以完成你要做的事情。lifecyclep.s-属性名称中的输入错误:var imageDispalyed=false(我尝试过编辑它,但编辑需要6个字符)您是否尝试过将逻辑放入awakeFromNib
?能否提供有关您尝试完成的操作的其他详细信息?您是否试图从单元格右侧将图像定位10点?正确。我试着将图像定位在单元格右侧10点处。这就是为什么我需要动态地确定单元格的宽度(它们的大小不尽相同)。你能提供更多关于你想要完成什么的细节吗?您是否试图从单元格右侧将图像定位10点?正确。我试着将图像定位在单元格右侧10点处。这就是为什么我需要动态地确定单元格的宽度(它们的大小不尽相同)。