首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元格中的UICollectionview视图绘图不正确

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

Stack Overflow用户
提问于 2016-01-19 15:32:12
回答 1查看 964关注 0票数 1

我正在为Apple-tv编写一个聊天应用程序,我有一个在细胞聊天中显示自定义视图的问题。

我有代码:

代码语言:javascript
复制
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中--一个string类型的数组。当滚动显示错误消失时,存储被正确组织。因此,可以得出渲染函数的正确性的结论。

在调用reloadData()collectionView之后,在historyString中附加的所有新消息都必须重新绘制。

我可能会犯错的地方?我试图清理collectionViewsubview,禁用滚动动画,但没有帮助。

程序绘图视图的代码:

代码语言:javascript
复制
    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进行更改后,我得到了以下代码:

代码语言:javascript
复制
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
}

函数对自定义单元格也有更改:

代码语言:javascript
复制
    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中做错了什么?我必须做另一件事吗?

EN

回答 1

Stack Overflow用户

发布于 2016-01-22 13:46:58

问题已经解决了!我不知道prepareForReuse()方法。非常简单,在自定义单元格类defeniton中,我必须覆盖它的方法,并调用子视图clearsContextBeforeDrawing和removeFromSuperview。代码如下:

代码语言:javascript
复制
class chatCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var view: Chat_ViewInCell!

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34870915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档