Динамический размер подпредставлений UITableViewCell с прототипами раскадровки - PullRequest
2 голосов
/ 03 апреля 2012

Я использую раскадровку, чтобы определить одну из ячеек прототипа как «Пользовательскую» и добавляю UITextField.Слева от него есть метка (со статическим текстом).Это похоже на тип ячейки «Right Detail», только правая часть редактируется.

Есть ли способ экономичного изменения размера текстового поля, чтобы оно доходило от конца текстовой метки до правого края?Текстовая метка слева должна быть достаточно большой, чтобы показать ее текст.

Я знаю о sizeToFit и sizeWithFont:constrainedToSize:, но изменение размеров подпредставлений кажется довольно громоздким, и его придется повторять при каждой переработке ячейки.

Есть ли способ работать с autoresizingMask из UIView, возможно, указав это в IB / раскадровке?

1 Ответ

4 голосов
/ 03 апреля 2012

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

Вы можете попробовать что-то вроде следующего. Это только примерный проект, чтобы дать вам общее представление, но он работает довольно хорошо.

Я создал пустой проект с одним контроллером табличного представления. У этого было жестко закодированное количество секций (1) и рядов (10). У меня была одна прототипная ячейка типа Basic. Вы можете установить любой вид, который вам нравится, как вспомогательный вид, поэтому я использовал текстовое поле. Поэтому вся магия происходит в cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    if (!cell.accessoryView)
    {
        UITextField *accessory = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 30.0)];
        accessory.borderStyle = UITextBorderStyleLine; // Just so you can see the effect
        cell.accessoryView = accessory;
    }

    NSMutableString *text = [NSMutableString stringWithFormat:@"A"];

    for (int i = 0; i < indexPath.row; i++) {
        [text appendFormat:@"A"]; // Just to illustrate different sizes
    }

    cell.textLabel.text = text;

    CGSize labelSize = [cell.textLabel.text sizeWithFont:cell.textLabel.font];
    CGRect accessoryFrame = cell.accessoryView.frame;

    accessoryFrame.size.width = cell.bounds.size.width - labelSize.width - 40; 
    // 40 is a magic number to prevent overlaps, you could be cleverer here
    // You'd also want to restrict to some minimum width.
    cell.accessoryView.frame = accessoryFrame;

    return cell;
}

Ключевые моменты:

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

Создает следующий вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...