Каков наилучший способ динамического содержимого ячейки? - PullRequest
0 голосов
/ 08 декабря 2018

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

enter image description here

Обычно для динамического содержимого ячейки я изменяю размер ячейки в sizeForItem делегата, например:

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

    print(")-Layouting each cell")

    let textView = UITextView()
    textView.isScrollEnabled = false
    textView.font = UIFont.preferredFont(forTextStyle: .subheadline)
    textView.text = posts[indexPath.item].statusText

    let estimatedSizeForStatus = textView.sizeThatFits(CGSize(width: view.frame.width, height: .infinity))


    return CGSize(width: view.frame.width, height: 470 + estimatedSizeForStatus.height)
}

Но мне сложно поддерживать код,Когда я захочу изменить размер шрифта состояния, мне придется заменить код в 2 местах (в классе делегата и ячейки).

Есть ли лучший способ улучшить это?

1 Ответ

0 голосов
/ 08 декабря 2018

Вы можете использовать табличное представление или коллекционное представление с автоматическим изменением размера пользовательских ячеек и автоматическим расположением:

https://www.raywenderlich.com/8549-self-sizing-table-view-cells

https://engineering.shopspring.com/dynamic-cell-sizing-in-uicollectionview-fd95f614ef80

Для отображения текстаВы можете использовать UILabel вместо UITextView.Установите для .numberOfLines значение 0, что позволит изменить его размер до необходимого.И не забудьте добавить для него также соответствующие ограничения Leading, Trailing, Top и Bottom.

Более продвинутый:

  • Вы можете создать собственный .plist,Файл .xml, .json и т. д., содержащий всю информацию пользовательского интерфейса / настройки темы, в которой вы будете хранить названия и размеры шрифтов для каждой метки, кнопки и т. д.

  • Загрузить эту информацию исделать его доступным для View Controller

  • Проверьте, был ли в этом файле указан нестандартный шрифт.Если да - используйте его, и код будет использовать его везде.Если «Нет» - просто используйте текст по умолчанию, как вы делали выше.

  • Вам придется использовать троичный оператор или оператор слияния везде, где вам может понадобиться использовать значения «Dynamic View Styling».

Ваш код станет примерно таким:

textView.font = ThemeSettings.headerTextFont() != nil ? ThemeSettings.headerTextFont() : UIFont.preferredFont(forTextStyle: .subheadline)

или:

textView.font = ThemeSettings.headerTextFont() ?? UIFont.preferredFont(forTextStyle: .subheadline)

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

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

...