2015-05-08 3 views
7

Я новичок в разработке iOS. У меня проблема с размером ячейки. Я не использую функцию Auto-Laylout. Моя текущая ячейка TableView выглядит что-то like this. Я хочу сделать размер метки, который выбран в image, для динамического расширения на основе текстового содержимого этой метки.Расширение метки/размера ячейки на основе размера текста в UITableView Swift

Заранее спасибо.

+1

проверить [это] (http://stackoverflow.com/questions/19215199/dynamically-size-uitableviewcell-according-to-uilabel-with-paragraph-spacing). Это Objctive-C версия –

+0

@Boyi Li, извините, я понятия не имею о Objective C, пожалуйста, помогите ... –

+0

Это можно сделать с помощью 2 строк кода, если вы используете автоматическую компоновку. Почему вы не используете это? – rdelmar

ответ

10

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

class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 

var messageArray:[String] = [] 
override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
     messageArray = ["One of the most interesting features of Newsstand is that once an asset downloading has started it will continue even if the application is suspended (that is: not running but still in memory) or it is terminated. Of course during while your app is suspended it will not receive any status update but it will be woken up in the background", 
         "In case that app has been terminated while downloading was in progress, the situation is different. Infact in the event of a finished downloading the app can not be simply woken up and the connection delegate finish download method called, as when an app is terminated its App delegate object doesn’t exist anymore. In such case the system will relaunch the app in the background.", 
         " If defined, this key will contain the array of all asset identifiers that caused the launch. From my tests it doesn’t seem this check is really required if you reconnect the pending downloading as explained in the next paragraph.", 
         "Whale&W", 
         "Rcokey", 
         "Punch", 
         "See & Dive"] 
} 

в приведенном выше мы имеем массив, содержащую строку разной длины

func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    { 
     return 1; 
    } 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return messageArray.count; 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("CELL") as? UITableViewCell; 
    if(cell == nil) 
    { 
     cell = UITableViewCell(style:UITableViewCellStyle.default, reuseIdentifier: "CELL") 
     cell?.selectionStyle = UITableViewCellSelectionStyle.none 
    } 
    cell?.textLabel.font = UIFont.systemFontOfSize(15.0) 
    cell?.textLabel.sizeToFit() 
    cell?.textLabel.text = messageArray[indexPath.row] 
    cell?.textLabel.numberOfLines = 0 
    return cell!; 
} 

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{ 
    var height:CGFloat = self.calculateHeightForString(messageArray[indexPath.row]) 
    return height + 70.0 
} 

func calculateHeight(inString:String) -> CGFloat 
{ 
    let messageString = inString 
    let attributes : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 15.0)] 

    let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes) 

    let rect : CGRect = attributedString.boundingRect(with: CGSize(width: 222.0, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil) 

    let requredSize:CGRect = rect 
    return requredSize.height 
} 

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

Результат будет таким, как показано ниже

enter image description here

+0

все ячейки превращаются в короткий размер, и нет другой разницы. Все содержимое похоже на слитое. –

+0

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

+1

не лучший способ сделать это, но он работает – cyril

1

Просто добавьте это в Viewdidload

tableView.estimatedRowHeight = 44.0 
tableView.rowHeight = UITableViewAutomaticDimension 
5

Try переопределять методы:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

Комплексное решение:

В прошивкой 8, Apple вводит новый для UITableView известных как ячейки для определения размеров. До iOS 8, если вы отображали динамический контент в виде таблицы с помощью разной строки, вам нужно рассчитать высоту строки самостоятельно.

В общем, вот шагах по реализации при использовании собственных размеров клеток:

• Добавить ограничение Автокомпоновки в вашем прототипе ячейке

• Укажите estimatedRowHeight вашего табличного

• Установить RowHeight вашего зрения табличного UITableViewAutomaticDimension

выражая последние две точки в коде, его внешний вид, как:

tableView.estimatedRowHeight = 43.0; 
tableView.rowHeight = UITableViewAutomaticDimension 

Вы должны добавить его в метод viewDidLoad.

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

В Атрибутах Инспектор вашего UILabel измените значение Lines на 0, поэтому метка автоматически отрегулирует количество строк, соответствующих содержанию.

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

Если вы банкнота знакомы с автоматической раскладки, пожалуйста, прочитайте это, будет достаточно:

https://developer.apple.com/library/mac/recipes/xcode_help-IB_auto_layout/chapters/pin-constraints.html

Или, более простой способ установить автоматическую раскладку, но, возможно, не будет то, что вы точно ожидать, чтобы очистите все свои ограничения, перейдите к разделу «Решение проблем автоматического макета», и для всех просмотров нажмите «Сброс» к «Предлагаемые ограничения».

+1

У меня все было в порядке, но мне не хватало этого «В Инспекторе атрибутов вашего UILabel, измените значение Lines на 0, поэтому метка автоматически отрегулирует количество строк, чтобы они соответствовали содержимому». сверху. Это сделал трюк. – neelabh

+0

Это сделало мой день Спасибо! – amar

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