Подтвердить что ты не робот

Uifyviewcell textlabel слишком длинная и выталкивает деталь текста

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

Когда я закодировал текст 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;
}

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

4b9b3361

Ответ 1

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

@property(nonatomic) UILineBreakMode lineBreakMode

Используйте его, как показано ниже.

myLabel.lineBreakMode = UILineBreakModeTailTruncation;

Вот список значений, которые можно использовать с lineBreakMode.

http://developer.apple.com/library/ios/#documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html#//apple_ref/doc/c_ref/UILineBreakMode

EDITED:

Задайте ширину вашего UILabel в соответствии с вашим требованием

например.

myLabel.frame.size.width = 320;

Ответ 2

Простейшим для меня был подкласс 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) {
        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;
    }
}

Ответ 4

У меня была такая же проблема, и мне пришлось создать подкласс 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

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

Ответ 5

У меня возникла аналогичная проблема при попытке использовать "Правый деталь" в UITableView; правильная деталь, встроенная в ярлык заголовка, сбивала мою подпись субтитров.

В конце концов я отказался от "Right Detail" в пользу своего собственного (используя быстрый и автозапуск):

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

    class TransactionCell: UITableViewCell
    {
    
    }
    
  • Я установил свою ячейку прототипа в этот пользовательский класс, установив поле "Стиль" в "Пользовательский" в меню "Table View Cell" и добавив "TransactionCell" в поле "Class" в "Custom Класса". Эти меню доступны, когда вы выбираете ячейку прототипа в раскадровке. введите описание изображения здесь введите описание изображения здесь

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

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

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

  1. ... и установите поля "Линии" и "Разрывы строк" ​​в соответствующих меню "Ярлыки", чтобы расстояние между метками было четным и чтобы метка моей информации могла сгибаться до нескольких строк. введите описание изображения здесь

Это работало для меня, позволяя мне гибко использовать разные количества строк в UITableView в swift для каждой ячейки, а форматирование обертывания слов так, чтобы оно выглядело красиво и даже, как я бы ожидал "Right Detail" делать автоматически.

Ответ 6

Отрегулируйте рамку вида: textLabel

 CGRect aFrame = cell.textLabel.frame;
 aFrame.size.width = 100;  // for example
 cell.textLabel.frame = aFrame;

Ответ 7

Обновлен ответ 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        
        }
    }
}

Ответ 8

Создайте пользовательский UITableViewCell с UILabel в нем, который вы можете контролировать, как хотите, или усечь текст, который вы назначаете базовому классу textLabel, чтобы соответствовать пространству, которое у вас есть.

Это не идеально, но я использовал технику усечения текста в местах, где пользовательская ячейка переполнена (например, когда единственная проблема была подходящей для текста) с использованием категории NSString со следующим методом:

- (NSString *)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont *)font
{
    NSString *result = [NSString stringWithString:self];

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

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

    return result;
}

Вероятно, не оптимизирован, но работает для простых сценариев.

Ответ 9

1st: установка режима прерывания строки

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;

Ответ 10

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

- (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;

Ответ 11

Я боролся с этой связкой и нашел довольно простой ответ. Мой 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()