繁体   English   中英

单元格中的UICollectionview视图绘制不正确

[英]UICollectionview view in cell incorrect drawing

我正在编写Apple-TV的聊天应用程序,但在单元格聊天中显示自定义视图时遇到问题。

我有代码:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) ->
        UICollectionViewCell {
            var myCell = self.chatCollectionView.dequeueReusableCellWithReuseIdentifier(chatCellIdentifier, forIndexPath: indexPath) as UICollectionViewCell
            myCell.removeFromSuperview()
                currentIndexPath = indexPath
                if flag[indexPath.row]==0
                {
                myCell = sendBotMessage(historyString[indexPath.row], path: indexPath, collectionView: chatCollectionView)
                }
                else
                {
                myCell = sendUserMessage(historyString[indexPath.row], path: indexPath, collectionView: chatCollectionView)
                }
            return myCell
    }

如所示,代码显示消息的两个版本, sendBotMessagesendUserMessage 问题在于下一个单元格的显示在前一个显示时不正确。 第一次运行带有1 sendBotMessage-view 首轮 然后添加第二项 第二次 第二个(右)消息由另一个视图sendUserMessage添加。 整个“对应关系”的历史记录都存储在historyString (字符串类型的数组)中。 正确组织存储,因为滚动显示错误消失。 因此,可以得出有关渲染函数正确性的结论。
所有新消息都附加在historyString ,此后必须重绘调用reloadData()collectionView

我在哪里可能犯错? 我试图清理collectionViewsubview ,禁用滚动动画,这没有帮助。

程序图视图的代码:

    func sendUserMessage(text : String, path : NSIndexPath, collectionView : UICollectionView) -> UICollectionViewCell {

        let userMessage = text
        let textSize = getTextFrameSize(userMessage)
        let frameForMessage = getFrameforView(textSize) 

        let messageBuble = Chat_ViewInCell(frame: frameForMessage, textSize: textSize, text: userMessage)
        messageBuble.backgroundColor = UIColor.clearColor()

        let avatarImage = UIImage(named: "\(userAvatar+1).png")
        let avatarView = UIImageView(image: avatarImage)
        avatarView.contentMode = UIViewContentMode.ScaleAspectFit

        let totalX = messageBuble.frame.width + 340
        let constraint = 1750 - totalX
        messageBuble.frame.origin = CGPointMake(constraint, 0)
        avatarView.frame = CGRectMake(messageBuble.frame.maxX + 10, 0, 170, 170)

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(chatCellIdentifier, forIndexPath: path) as! chatCollectionViewCell
        //добавляем, счастье, радуемся
        cell.addSubview(messageBuble)
        cell.addSubview(avatarView)
        return cell
    }
func sendBotMessage(text : String, path : NSIndexPath, collectionView : UICollectionView) -> UICollectionViewCell {

        let userMessage = text
        let textSize = getTextFrameSize(userMessage)
        let frameForMessage = getFrameforView(textSize) 

        let messageBuble = bot_ViewInCell(frame: frameForMessage, textSize: textSize, text: userMessage)
        messageBuble.backgroundColor = UIColor.clearColor()

        let avatarImage = UIImage(named: partner_image)
        let avatarView = UIImageView(image: avatarImage)
        avatarView.contentMode = UIViewContentMode.ScaleAspectFit
        avatarView.frame = CGRectMake(0, 0, 170, 170)
        let constraint = avatarView.frame.maxX + 10
        messageBuble.frame.origin = CGPointMake(constraint, 0)

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(chatCellIdentifier, forIndexPath: path) as! chatCollectionViewCell
        //добавляем в возвращаемую ячейку
        cell.addSubview(avatarView)
        cell.addSubview(messageBuble)
        return cell
    }

在使用自定义CollectionCellView进行建议的更改后,我得到了以下代码:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) ->
    UICollectionViewCell {
        var myCell = chatCollectionView.dequeueReusableCellWithReuseIdentifier(chatCellIdentifier, forIndexPath: indexPath) as! chatCollectionViewCell
        var customCell = myCell
            if flag[indexPath.row]==0
            {
            customCell = sendBotMessage(historyString[indexPath.row], path: indexPath, collectionView: collectionView)
            }
            else
            {
            customCell = sendUserMessage(historyString[indexPath.row], path: indexPath, collectionView: collectionView)
            }
        myCell = customCell
        currentIndexPath = indexPath
        return myCell
}

图纸上的功能也对自定义单元格进行了更改:

    func sendUserMessage(text : String, path : NSIndexPath, collectionView : UICollectionView) -> chatCollectionViewCell {

    let userMessage = text
    let textSize = getTextFrameSize(userMessage) //высчитали необходимые размеры лейбла
    let frameForMessage = getFrameforView(textSize) //высчиитали необходимые размеры всей вьюшки

    let messageBuble = Chat_ViewInCell(frame: frameForMessage, textSize: textSize, text: userMessage)
    messageBuble.backgroundColor = UIColor.clearColor()

    //создаем аватар
    let avatarImage = UIImage(named: "\(userAvatar+1).png")
    let avatarView = UIImageView(image: avatarImage)
    avatarView.contentMode = UIViewContentMode.ScaleAspectFit

    //считаем отступ до правого края, позицию аватара
    let totalX = messageBuble.frame.width + 340
    let constraint = 1750 - totalX
    messageBuble.frame.origin = CGPointMake(constraint, 0)
    avatarView.frame = CGRectMake(messageBuble.frame.maxX + 10, 0, 170, 170)

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(chatCellIdentifier, forIndexPath: path) as! chatCollectionViewCell
    //добавляем, счастье, радуемся
    cell.addSubview(messageBuble)
    cell.addSubview(avatarView)
    return cell
}

    func sendBotMessage(text : String, path : NSIndexPath, collectionView : UICollectionView) -> chatCollectionViewCell {

    let userMessage = text
    let textSize = getTextFrameSize(userMessage) //высчитали необходимые размеры лейбла
    let frameForMessage = getFrameforView(textSize) //высчиитали необходимые размеры всей вьюшки

    //создали всю вьюшку
    let messageBuble = bot_ViewInCell(frame: frameForMessage, textSize: textSize, text: userMessage)
    messageBuble.backgroundColor = UIColor.clearColor()

    //создаем аватар и считаем его позицию
    let avatarImage = UIImage(named: partner_image)
    let avatarView = UIImageView(image: avatarImage)
    avatarView.contentMode = UIViewContentMode.ScaleAspectFit
    avatarView.frame = CGRectMake(0, 0, 170, 170)
    let constraint = avatarView.frame.maxX + 10
    messageBuble.frame.origin = CGPointMake(constraint, 0)

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(chatCellIdentifier, forIndexPath: path) as! chatCollectionViewCell
    //добавляем в возвращаемую ячейку
    cell.addSubview(avatarView)
    cell.addSubview(messageBuble)
    return cell
}

但是没有办法解决问题...自定义CollectionViewCell有什么问题? 我必须做另一个吗?

问题已解决! 我不知道prepareForReuse()方法。 如此简单,在自定义单元格类定义中,我必须重写它的方法,并调用子视图clearsContextBeforeDrawing和removeFromSuperview。 代码在这里:

class chatCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var view: Chat_ViewInCell!

override func prepareForReuse() {
    super.prepareForReuse()
    for currView in self.subviews
    {
        currView.clearsContextBeforeDrawing = true
        currView.removeFromSuperview()
    }
}

一切正常,没有错误的重绘。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM