Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 试图确定子类UICollectionViewCell中的单元格宽度_Ios_Swift_Uicollectionview_Uicollectionviewcell - Fatal编程技术网

Ios 试图确定子类UICollectionViewCell中的单元格宽度

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,它会显示

我有一个基本的子类UICollectionView单元。我想给它添加一个UIImageView,这样每个单元格都会显示一个图像

如果我将显式值添加到x:y:width:height,则图像显示正确,但我不能使用
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点处。这就是为什么我需要动态地确定单元格的宽度(它们的大小不尽相同)。