проблема при установке динамической ширины ячейки представления коллекции - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь динамически установить ширину ячейки представления коллекции.Первоначально это не рендеринг, как ожидалось.Но когда я нажимаю на ячейку, она настраивается так, как я хочу.Вот код, который я написал:

Код

import UIKit

class ViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource {

    @IBOutlet weak var collView: UICollectionView!


    var tasksArray = ["To Do", "SHOPPING","WORK"]
    var selectedIndex = Int()

    override func viewDidLoad() {
        super.viewDidLoad()
        let layout = collView?.collectionViewLayout as! UICollectionViewFlowLayout
        layout.itemSize = UICollectionViewFlowLayout.automaticSize
        layout.estimatedItemSize = CGSize(width: 93, height: 40)
        // Do any additional setup after loading the view, typically from a nib.
    }
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return tasksArray.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionViewCell
        cell.lblName.text = tasksArray[indexPath.row]
        if selectedIndex == indexPath.row
        {
            cell.backgroundColor = UIColor.lightGray
        }
        else
        {
            cell.backgroundColor = UIColor.white
        }
        cell.layer.borderWidth = 1
        cell.layer.cornerRadius = cell.frame.height / 2
        return cell
    }
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        selectedIndex = indexPath.row
        self.collView.reloadData()
    }
}

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

[! [Вот изображение до того, как я нажму

this is after tapping on cell its give me perfect result в ячейке] 2 ] 2

поэтому, пожалуйста, скажите мне, что не так в моем коде

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Внутри вашей функции CollectionViewCell override preferredLayoutAttributesFitting. Здесь ячейка может указать свои предпочтительные атрибуты, включая размер, который мы рассчитываем с помощью автоматического макета.

 override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
    setNeedsLayout()
    layoutIfNeeded()
    let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
    var frame = layoutAttributes.frame
    frame.size.width = ceil(size.width)
    layoutAttributes.frame = frame
    return layoutAttributes
}
0 голосов
/ 04 февраля 2019

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

Давайте представим несколько расширений, которые помогут нам на этом пути

StringExtensions.swift

extension String {

    public func width(withConstrainedHeight height: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
        let boundingBox = self.boundingRect(with: constraintRect,
                                        options: .usesLineFragmentOrigin,
                                        attributes: [.font: font], context: nil)

        return ceil(boundingBox.width)
    }
}

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

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let height = 40
    let text = YOUR_TEXT
    let width = text.width(withConstrainedHeight: height, font: Font.regular.withSize(.extraSmall)) + EXTRA_SPACES_FOR_LEFT_RIGHT_PADDING
    return CGSize(width: width, height: height)
}
0 голосов
/ 04 февраля 2019

Я нашел маленький трюк для быстрого 4.2

Для динамической ширины и фиксированной высоты:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let label = UILabel(frame: CGRect.zero)
    label.text = textArray[indexPath.item]
    label.sizeToFit()
    return CGSize(width: label.frame.width, height: 32)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...