Swift, изменить ширину UICollectionViewCell и UILabel (внутри ячейки) программно

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

В паре вопросов говорилось об использовании collectionViewLayout, но я действительно изо всех сил пытаюсь использовать его в своем коде. Любые идеи? Благодарю вас!

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    var cell = collectionView.dequeueReusableCellWithReuseIdentifier("myCell", forIndexPath: indexPath) as LocationViewCell
    cell.locationLabel.text = "Hello there!"

    // Set cell & label width to 100%
    let collectionViewWidth = self.collectionView.bounds.size.width
    cell.frame.size.width = collectionViewWidth // Works
    cell.locationLabel.frame.size.width = collectionViewWidth // Does NOT 

Обновление 1

Поэтому я добавил следующее:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    // Set cell width to 100%
    let collectionViewWidth = self.collectionView.bounds.size.width
    return CGSize(width: collectionViewWidth, height: 35)
}

Что происходит, так это то, что при загрузке представления ширина UILabel все еще мала. Если я перейду к другому виду, а затем вернусь обратно, то это 100%. Так что я должен что-то сделать в viewDidLoad() правильно? Я уже использую self.collectionView.reloadData(), но, думаю, это только для данных.

Обновление 2

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    var cell = collectionView.dequeueReusableCellWithReuseIdentifier("locationCell", forIndexPath: indexPath) as LocationViewCell
    cell.locationLabel.text = "Hello UILabel"

    // Set cell width to 100%
    let collectionViewWidth = self.collectionView.bounds.size.width
    cell.frame.size.width = collectionViewWidth
    cell.locationLabel.frame.size.width = collectionViewWidth

    return cell
}

person manosim    schedule 28.12.2014    source источник
comment
Обновление 1 помогло мне увидеть, что я должен сравнивать размер представления коллекции, а не размер контроллера представления... спасибо!   -  person amcastror    schedule 11.03.2017


Ответы (1)


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

optional func collectionView(_ collectionView: UICollectionView,
                  layout collectionViewLayout: UICollectionViewLayout,
             sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize

Здесь вы должны установить размер ваших ячеек.

person Abizern    schedule 28.12.2014
comment
Я обновил вопрос с вашим предложением. Это почти работает, но в первый раз, когда он появляется, он все еще маленький. Если я перейду к другому виду, а затем вернусь, это будет ширина, которую я хочу. Как я могу сделать так, чтобы он показывал правильную ширину в начале? - person manosim; 28.12.2014
comment
Как вы определяете размер метки внутри ячейки? - person Abizern; 28.12.2014
comment
Я добавил точный код в вопрос. Так что в основном я использую cell.locationLabel.frame.size.width. - person manosim; 28.12.2014
comment
Поставьте точку останова на этой строке и посмотрите, какие размеры получатся. Я думаю, вы увидите, в чем проблема. - person Abizern; 28.12.2014
comment
Ну, я вижу, что значение collectionViewWith правильное, и оно запускается до загрузки представления. Но я предполагаю, что, возможно, функция sizeForItemAtIndexPath, которую вы предложили, не запускается только при первой загрузке представления. - person manosim; 28.12.2014
comment
Решено! Таким образом, предложенный вами код устанавливает ширину ячейки. Проблема, с которой я столкнулся после добавления вашего кода, заключалась в том, что мне пришлось установить ширину UILabel. Я сделал это, добавив ограничения из MainStoryboard (Выбрал метку и добавил 0 интервалов слева и справа от ближайшего соседа)! Я подумал, что должен сообщить другим людям, как они могут это сделать! Спасибо! - person manosim; 28.12.2014
comment
@МанолисС. Разве не лучше решить это самостоятельно (с легким нажимом), чем просто попросить кого-то дать вам ответ? :) - person Abizern; 28.12.2014
comment
Дааа! :D Это первый раз, когда я использую UICollectionView, поэтому я немного растерялся, но, думаю, теперь я более уверен! Пришлось клонировать UIPickerView, потому что нам не разрешено изменять его высоту. Но теперь с UICollectionView я чувствую, что могу многое! Спасибо еще раз! - person manosim; 28.12.2014