uitableviewcell textlabel太长,推出detailtextlabel看不见

时间:2011-04-21 15:02:23

标签: iphone uitableview textlabel

当我使用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 个答案:

答案 0 :(得分:15)

对我来说最简单的是继承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;
    }
}

答案 1 :(得分:6)

@Jhaliya @lucas

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

见这里:Custom UITableViewCell. Failed to apply UILineBreakModeTailTruncation

答案 2 :(得分:3)

我遇到了同样的问题,不得不创建一个 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

一旦你这样做,你就应该全力以赴。祝你好运!

答案 3 :(得分:2)

我在尝试使用&#34; Right Detail&#34;时遇到了类似的问题。在UITableView中;内置标题标签的正确细节破坏了我的字幕标签。

最终我放弃了#34; Right Detail&#34;支持我自己的自定义(使用swift和autolayout):

  1. 我创建了自己的简单类,它继承自UITableViewCell:

    class TransactionCell: UITableViewCell
    {
    
    }
    
  2. 我通过设置&#34; Style&#34;将我的原型单元格设置为自定义类。字段到&#34;自定义&#34;在&#34;表格查看单元格&#34;菜单并添加&#34; TransactionCell&#34;到了#34; Class&#34; &#34; Custom Class&#34;菜单。在故事板中选择原型单元格时,可以使用这些菜单。 enter image description here enter image description here

  3. 我在我的原型单元格中添加了两个标签,并通过右键单击从我的标签拖到我的班级将它们连接到我的自定义类(奇怪的是,我必须先清理我的构建才能让我这样做):< / p>

    class TransactionCell: UITableViewCell{
    
        @IBOutlet weak var detailsLabel: UILabel!
    
        @IBOutlet weak var amountLabel: UILabel!
    
    }
    
  4. 我为我的标签添加了新约束,利用了快速的自动布局功能(您需要根据自己的要求设置这些约束;如果您遇到困难,请参阅自动布局教程)

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

    1. ...并设置&#34; Lines&#34;和&#34;换行&#34;各自&#34;标签&#34;中的字段菜单,以便标签之间的间距是均匀的,以便我的细节标签可以弯曲到多行。 enter image description here
    2. 它对我有用,允许我在每个单元格中的UITableView中具有不同数量的多行的灵活性,同时格式化自动换行以使其看起来很好甚至,就像我预期的那样#34 ;正确的细节&#34;自动做。

答案 4 :(得分:1)

调整视图框架:textLabel

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

答案 5 :(得分:1)

更新了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        
        }
    }
}

答案 6 :(得分:0)

创建一个带有UILabel的自定义UITableViewCell,您可以根据需要控制它,或者截断分配给基类textLabel的文本以适合您拥有的空间。

这并不完美,但我使用文本截断技术在自定义单元格过度使用的地方(例如,当唯一的问题是适合文本时)使用NSString类别,方法类似于以下方法: / p>

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

可能不是'优化',但它适用于简单的场景。

答案 7 :(得分:0)

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;

答案 8 :(得分:0)

有效!!但我刚改变了Christopher King的代码:

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

答案 9 :(得分:0)

我在这一堆中苦苦挣扎并找到了一个非常简单的答案。我的textLabel位于左侧,会将右边的detailText推出到有时无法看到它的位置。

我的解决方案,将Table View Cell styleSubtitleLeft 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()

答案 10 :(得分:0)

支持最新的iOS(12)的Swift版本:

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
    }
}

答案 11 :(得分:-7)

使用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

已编辑:

根据您的要求设置UILabel的宽度

例如

myLabel.frame.size.width = 320;