Пользовательские ячейки CollectionView не выбираются, но регистрируют выделение вне пространства ячейки - PullRequest
0 голосов
/ 03 июля 2018

view example

В приведенном выше примере нажатие на синюю ячейку не запускает ни один из методов делегата collectionView, например, «didSelectItem». Но щелкнув в оставшееся пустое пространство прямо слева от него будет. Это пользовательская ячейка с текстовым представлением поверх UIView с синим фоном. Это ожидаемое поведение?

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return messages.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! ChatMessageCell

    let message = messages[indexPath.item]
    cell.textView.text = message.text

    setupCell(cell: cell, message: message)

    if let text = message.text {
     cell.bubbleWidthAnchor?.constant = estimateFrameForText(text: text).width + 32
    } else if message.imageUrl != nil {
        cell.bubbleWidthAnchor?.constant = 200
    }

    return cell
}

private func setupCell(cell: ChatMessageCell, message: Message) {
    if let profileImageUrl = self.user?.profileImageUrl {
        cell.profileImageView.loadImageUsingCacheWithUrlString(urlString: profileImageUrl)
    }

    if message.fromId == Auth.auth().currentUser?.uid {
        cell.bubbleView.backgroundColor = ChatMessageCell.blueColor
        cell.textView.isHidden = false
        cell.textView.textColor = UIColor.white
        cell.profileImageView.isHidden = true
        cell.messageImageView.isHidden = true

        cell.bubbleViewRightAnchor?.isActive = true
        cell.bubbleViewLeftAnchor?.isActive = false
    } else {
        cell.bubbleView.backgroundColor = UIColor(r: 220, g: 220, b: 220)
        cell.textView.textColor = UIColor.black
        cell.profileImageView.isHidden = false
        cell.messageImageView.isHidden = true

        cell.bubbleViewRightAnchor?.isActive = false
        cell.bubbleViewLeftAnchor?.isActive = true
    }

    if let messageImageUrl = message.imageUrl {
        cell.messageImageView.loadImageUsingCacheWithUrlString(urlString: messageImageUrl)
        cell.textView.isHidden = true
        cell.messageImageView.isHidden = false
        cell.bubbleView.backgroundColor = UIColor.clear
    } else {
        cell.messageImageView.isHidden = true
    }
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    var height: CGFloat = 80

    let message = messages[indexPath.item]

    if let text = message.text {
        height = estimateFrameForText(text: text).height + 18
    } else if let imageWidth = message.imageWidth?.floatValue, let imageHeight = message.imageHeight?.floatValue {

        height = CGFloat(imageHeight / imageWidth * 200)

    }

    let width = UIScreen.main.bounds.width
    return CGSize(width: width, height: height)
}

private func estimateFrameForText(text: String) -> CGRect {
    let size = CGSize(width: 200, height: 1000)
    let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin) // look this up on stack overflow

    return NSString(string: text).boundingRect(with: size, options: options, attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 16)], context: nil)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...