Превращение UILabel в ячейку Collection View - PullRequest
0 голосов
/ 13 мая 2018

У меня есть ячейки представления коллекции с равной шириной и высотой в макете потока.Они содержат один UILabel, свойство numberOfLines которого установлено на 0.Ограничения метки:

enter image description here

Ячейка сделана круглой:

 cell.layer.cornerRadius = cell.frame.width / 2
 cell.clipsToBounds = true

Я увеличиваю размер каждой ячейкина основе размера текста метки.Однако его ширина и высота не могут превышать 150.Вот как я определяю размер каждой ячейки:

private func estimatedFrameForText(text: String) -> CGRect {
    let size = CGSize(width: 100, height: 1000)
    let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)

    return NSString(string: text).boundingRect(with: size, options: options, attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 17)], context: nil)
}

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


    let hashLabelText = textArray[indexPath.item]
    let textSize = estimatedFrameForText(text: hashLabelText)


    let width = min(150, textSize.width + 20)
    let height = width

    return CGSize(width: width, height: height)
}

С этим я получаю следующий результат (я показываю ту часть, где ширина и высота ячеек равны 150):

enter image description here

Как вы можете видеть, когда ячейка достигает максимально возможного размера и текст меток продолжает увеличиваться, в какой-то момент текстсбивается с видимой части клеток.Я понимаю, почему это происходит (отладчик разметки показывает это ясно), однако пока не могу найти решение проблемы.

Я хочу, чтобы края метки оставались видимыми, независимо от того, чторазмер ячейки.Хвост текста может быть обрезан, если ячейка достигает максимального размера, но текст продолжает увеличиваться.

Я пытался увеличить расстояние между меткой и границами ячеек, но это влияет на то, как текствыглядит в самых маленьких клетках.Я также пытался изменить минимальный масштаб шрифта на этикетке, но снова безуспешно.

1 Ответ

0 голосов
/ 13 мая 2018

Для этого вы должны использовать UIEdgeInsets. Создайте класс для UILabel:

import UIKit

class UILabelDraw: UILabel {
    override func drawText(in rect: CGRect) {
        let insets: UIEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 10.0, right: 10.0)
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }
}

Используйте этот класс в качестве класса Label, как показано ниже:

enter image description here

Выход UIEdgeInsets ниже:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...