2015-09-17 7 views
0

Как изменить высоту ячейки UICollectionView? enter image description hereИзменение размера ячейки UICollectionView в зависимости от размера метки

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

ответ

1

Этот ответ не изменяет размер ячейки на всех, но это может быть решение вашей проблемы. В вашей cellForItemAtIndexPath после установки вашей клетки: let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell

Попробуйте добавить это: cell.imageText.adjustsFontSizeToFitWidth = true

Это позволит сделать шрифт подогнать размер этикетки, и больше текста, тем меньше размера шрифта. Дайте мне знать, как это сработало для вас.

+0

Я мог бы использовать это. Я также могу установить максимум символов в метке. У меня есть хорошая идея! Спасибо. –

+0

@ Eri-Sklii Нет проблем. Надеюсь, это сработало для вас. –

0

Попробуйте создать поддельный ярлык с тем же текстом, назовите sizetofit на нем, а затем увидите фактический размер ярлыка с полным текстом.

Затем, как только вы получите вершину, вы можете установить ее в свой элемент collectionViewLayout itemSize.

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

+0

Не могли бы вы привести мне пример этого, пожалуйста? –

1

Вы должны использовать метод делегата называется collectionView:layout:sizeForItemAtIndexPath из UICollectionViewDelegateFlowLayout.


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

Он использует единую настраиваемую ячейку типа MyAwesomeCell, которая имеет одну розетку с этикеткой под названием myAwesomeLabel.

я не сделал каких-либо изменений в раскадровке относительно Preferred Width, Content Compression Resistance Priority и т.д. Единственное важное изменение, которое я сделал это установка lines свойство 0 для метки, что означает неограниченное количество строк.

PS, это было написано в Swift 2.


// 
// ViewController.swift 
// CollectionCell 
// 
// Created by Stefan Veis Pennerup on 21/09/15. 
// Copyright © 2015 Kumuluzz. All rights reserved. 
// 

import UIKit 

class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout { 

    // MARK: - Constants 

    struct Constants { 
     static let ReuseIdentifierMyAwesomeCell = "myAwesomeCell" 
    } 

    // MARK: - Models 

    let myAwesomeCells = [ 
     "Lorem ipsum dolor sit amet.", 
     "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed massa leo, mollis id tortor at posuere.", 
     "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque semper vitae mi vel hendrerit. Suspendisse et feugiat mi. Donec quis sollicitudin quam, non porttitor nulla. Phasellus in luctus lorem, sed auctor enim. Suspendisse potenti. Ut maximus pharetra diam, ac laoreet est dignissim eu nullam." 
    ] 

    var cellSizes: [CGSize]! 

    // MARK: - Lifecycle methods 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Gives the size array an initial value since collectionView:layout:sizeForItemAtIndexPath 
     // is called before collectionView:cellForItemAtIndexPath 
     cellSizes = myAwesomeCells.map({ _ in return CGSize(width: 200, height: 50) }) 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 

     // Now that the collection view has appeared, then all the cells have been initialized 
     // with their appropiate content. The view should then be reloaded with the newly 
     // calculated sizes as well. 
     collectionView?.reloadData() 
    } 

    // MARK: - UICollectionViewDataSource 

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     NSLog("\(self), collectionView:numberOfItemsInSection") 
     return myAwesomeCells.count 
    } 

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     NSLog("\(self), collectionView:cellForItemAtIndexPath") 

     // Configures the cell 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier(Constants.ReuseIdentifierMyAwesomeCell, forIndexPath: indexPath) as! MyAwesomeCell 
     cell.myAwesomeLabel.text = myAwesomeCells[indexPath.item] 

     // Calculates the height 
     cell.setNeedsLayout() 
     cell.layoutIfNeeded() 
     cellSizes[indexPath.item] = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) 

     // Returns the new cell 
     return cell 
    } 

    // MARK: - UICollectionViewDelegate 

    // MARK: - UICollectionViewDelegateFlowLayout 

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
     NSLog("\(self), collectionView:layout:sizeForItemAtIndexPath") 
     return cellSizes[indexPath.item] 
    } 

} 
Смежные вопросы