слишком длинная текстовая метка в uitableviewcell и выталкивает текстовую метку из поля зрения - PullRequest
28 голосов
/ 21 апреля 2011

Когда я использую UITableViewCellStyleValue1, я получил длинную строку textLabel, и каким-то образом detailTextLabel выдвинулся из представления.

Когда я закорочил свой текст textLabel, то я могу увидеть текст detailTextLabel.

Можно ли в любом случае ограничить ширину textLabel в вышеприведенном стиле, чтобы он урезал textLabel слишком длинным?

Мой код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];

}

cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;

//---get the letter in each section; e.g., A, B, C, etc.---
NSString *alphabet = [self.currencyNameIndex objectAtIndex:[indexPath section]];

//---get all states beginning with the letter---
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
self.currencyList = [self.keyCurrencyName filteredArrayUsingPredicate:predicate];

if ([self.currencyList count] > 0) 
{
    NSString *currencyName = [self.keyCurrencyName objectAtIndex:indexPath.row];
    cell.textLabel.text = currencyName;

    NSString *currencyCode = [self.valueCurrencyCode objectAtIndex:indexPath.row];
    cell.detailTextLabel.text = currencyCode;

}   

return cell;
}

поэтому название моей валюты будет длинным в какой-то записи.

Ответы [ 12 ]

15 голосов
/ 10 сентября 2013

Для меня проще всего было создать подкласс UITableViewCell и переопределить layoutSubviews.

Не удалось найти надежный способ вычисления позиций только из фреймов меток, поэтому просто жестко закодировали ширину аксессуара для в этом случае ячейки UITableViewCellStyleValue1 с типом аксессуара UITableViewCellAccessoryDisclosureIndicator.

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGFloat detailTextLabelWidth = [self.detailTextLabel.text sizeWithFont:self.detailTextLabel.font].width;
    CGRect detailTextLabelFrame = self.detailTextLabel.frame;

    if (detailTextLabelFrame.size.width <= detailTextLabelWidth && detailTextLabelWidth > 0) {
        detailTextLabelFrame.size.width = detailTextLabelWidth;
        CGFloat accessoryWidth = (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) ? 28.0f : 35.0f;
        detailTextLabelFrame.origin.x = self.frame.size.width - accessoryWidth - detailTextLabelWidth;
        self.detailTextLabel.frame = detailTextLabelFrame;

        CGRect textLabelFrame = self.textLabel.frame;
        textLabelFrame.size.width = detailTextLabelFrame.origin.x - textLabelFrame.origin.x;
        self.textLabel.frame = textLabelFrame;
    }
}
6 голосов
/ 25 мая 2011

@ Jhaliya @lucas

cell.textLabel.numberOfLines = 3; // set the numberOfLines
cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;

см. Здесь: Пользовательский UITableViewCell. Не удалось применить UILineBreakModeTailTruncation

3 голосов
/ 30 августа 2012

У меня была та же проблема, и я должен был создать подкласс UITableViewCell . Это легче сделать, чем я думал:

По сути, просто создайте новый файл, который является подклассом UITableViewCell

Добавьте метки и синтезируйте их:

// in the .h file
@property (nonatomic, weak) IBOutlet UILabel *textLabel;
@property (nonatomic, weak) IBOutlet UILabel *detailTextLabel;
// in the .m file
@synthesize textLabel, detailTextLabel;

В StoryBoard установите свой класс в качестве класса ячейки, сделайте стиль "Пользовательским" и добавьте две метки в ячейку, чтобы они выглядели именно так, как вы хотите (я сделал так, чтобы они выглядели так же, как по умолчанию: http://cl.ly/J7z3)

Самая важная часть - убедиться, что вы подключили метки к ячейке

Необходимо щелкнуть элемент управления в ячейке с помощью ярлыка на схеме документа. Вот изображение того, на что это похоже: http://cl.ly/J7BP

Что помогло мне понять, как создавать пользовательские ячейки, динамические ячейки и статические ячейки, это видео на YouTube: http://www.youtube.com/watch?v=fnzkcV_XUw8

Как только вы это сделаете, у вас все будет готово. Удачи!

2 голосов
/ 31 декабря 2015

Я столкнулся с подобной проблемой при попытке использовать «Right Detail» в UITableView;встроенная метка заголовка нужной детали засоряла мою метку субтитров.

В конце концов я отказался от «Правильной детализации» в пользу своей собственной (с использованием swift и autolayout):

  1. Я создал свой собственный простой класс, унаследованный от UITableViewCell:

    class TransactionCell: UITableViewCell
    {
    
    }
    
  2. Я установил в своей ячейке-прототипе использование этого пользовательского класса, установив для поля "Стиль" значение "Пользовательский »в меню« Ячейка табличного представления »и путем добавления« TransactionCell »в поле« Класс »меню« Пользовательский класс ».Эти меню доступны, когда вы выбираете ячейку прототипа в раскадровке.enter image description hereenter image description here

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

    class TransactionCell: UITableViewCell{
    
        @IBOutlet weak var detailsLabel: UILabel!
    
        @IBOutlet weak var amountLabel: UILabel!
    
    }
    
  4. Я добавил новые ограничения для своих ярлыков, используя преимущества Swiftфункции автопоставки (вам необходимо настроить их в соответствии с вашими требованиями; см. учебник по автопрокладке, если вы застряли)

How to add new constraints: click on the thing to add constraints to then click on this symbol

... и установите поля «Линии» и «Разрывы строк» ​​в соответствующих меню «Метка», чтобы интервал между метками был ровным и чтобы моя метка сведений могла сгибаться до нескольких строк.enter image description here

Это сработало для меня, позволяя мне иметь гибкость в различном количестве нескольких строк в UITableView в быстрой смене на ячейку, форматируя перенос слов так, чтобыэто выглядело красиво и даже, как я и ожидал, «Правая деталь» будет выполняться автоматически.

1 голос
/ 14 июня 2017

Обновлен ответ Gosoftworks Development.

Swift 3

class BaseTableViewCell: UITableViewCell {
    override func layoutSubviews() {
        super.layoutSubviews()

        guard let tl = textLabel, let dl = detailTextLabel else { return }
        if (tl.frame.maxX > dl.frame.minX) {
             tl.frame.size.width = dl.frame.minX - tl.frame.minX - 5        
        }
    }
}
1 голос
/ 21 апреля 2011

Настройка рамки просмотра: textLabel

 CGRect aFrame = cell.textLabel.frame;
 aFrame.size.width = 100;  // for example
 cell.textLabel.frame = aFrame;
0 голосов
/ 27 марта 2019

Swift версия с поддержкой последней версии iOS (12):

override func layoutSubviews() {
    super.layoutSubviews()
    guard let detailWidth = detailTextLabel?.intrinsicContentSize.width, var detailFrame = detailTextLabel?.frame else {
        return
    }

    let padding = layoutMargins.right
    if (detailFrame.size.width <= detailWidth) && (detailWidth > 0) {
        detailFrame.size.width = detailWidth
        detailFrame.origin.x = frame.size.width - detailWidth - padding
        detailTextLabel?.frame = detailFrame

        var textLabelFrame = textLabel!.frame
        textLabelFrame.size.width = detailFrame.origin.x - textLabelFrame.origin.x - padding
        textLabel?.frame = textLabelFrame
    }
}
0 голосов
/ 22 декабря 2015

Я боролся с этой кучей и нашел довольно простой ответ.Мой textLabel был слева и выталкивал detailText справа до точки, которую вы иногда вообще не видели.

Мое решение, измените Table View Cell style наSubtitle из Left Detail или Right Detail.Это решение работает, если вы не против того, чтобы detailText находился внизу, а не справа или слева.

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

    self.tableView.estimatedRowHeight = 500 // set this as high as you might need, although I haven't tested alternatives
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.reloadData()
0 голосов
/ 11 ноября 2014

Работает !!Но я только что изменил код Кристофера Кинга:

- (NSString *)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont *)font :(NSString*) result
{

    while ([result sizeWithFont:font].width > width)
    {
        result = [result stringByReplacingOccurrencesOfString:@"..." withString:[NSString string]];

        result = [[result substringToIndex:([result length] - 1)] stringByAppendingString:@"..."];
    }

    return result;
}

и использование:

NSString* text = @"bla bla bla some long text bla bla";
text = [self stringByTruncatingToWidth:cell.frame.size.width-70.0 withFont:[UIFont systemFontOfSize:17] :text];
cell.textLabel.text = text;
0 голосов
/ 14 марта 2014

1-й: установить режим разрыва строки

textLabel.lineBreakMode = NSLineBreakByTruncatingTail;

2nd: установите желаемую ширину рамки texLabel (например, 200)

CGRect textFrame = self.textLabel.frame;
CGRect newTextFrame = CGRectMake(textFrame.origin.x, textFrame.origin.y, 200, textFrame.size.height);
self.textLabel.frame = newTextFrame;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...