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;
}
поэтому мое название валюты будет длинным в некоторой записи.
Ответы
Ответ 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;
}
}
Ответ 3
@Jhaliya @lucas
cell.textLabel.numberOfLines = 3; // set the numberOfLines
cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;
см. здесь: Пользовательский UITableViewCell. Не удалось применить UILineBreakModeTailTruncation
Ответ 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!
}
-
Я добавил новые ограничения для своих ярлыков, воспользовавшись быстрыми функциями автозапуска (вам нужно будет установить их в соответствии с вашими собственными требованиями, см. учебник по автозапуску, если вы застряли)
![Как добавить новые ограничения: нажмите на предмет добавления ограничений, а затем нажмите на этот символ]()
- ... и установите поля "Линии" и "Разрывы строк" в соответствующих меню "Ярлыки", чтобы расстояние между метками было четным и чтобы метка моей информации могла сгибаться до нескольких строк.
![введите описание изображения здесь]()
Это работало для меня, позволяя мне гибко использовать разные количества строк в 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()