31

当我使用 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;
}

所以我的货币名称在某些条目上会很长。

4

12 回答 12

16

对我来说最简单的是继承 UITableViewCell 并覆盖 layoutSubviews。

无法找到一种可靠的方法来仅从标签框架计算位置,因此在这种情况下,只需硬编码具有 UITableViewCellAccessoryDisclosureIndicator 附件类型的 UITableViewCellStyleValue1 单元格的附件宽度。

- (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;
    }
}
于 2013-09-09T20:43:07.887 回答
8

@Jhaliya @卢卡斯

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

请参见此处:自定义 UITableViewCell。未能应用 UILineBreakModeTailTruncation

于 2011-05-25T09:35:16.727 回答
4

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

最终我放弃了“正确的细节”,转而使用我自己的自定义(使用 swift 和自动布局):

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

    class TransactionCell: UITableViewCell
    {
    
    }
    
  2. 我通过将“表格视图单元”菜单上的“样式”字段设置为“自定义”并将“TransactionCell”添加到“自定义类”菜单的“类”字段中来设置我的原型单元格使用该自定义类。当您在情节提要中选择原型单元格时,这些菜单可用。 在此处输入图像描述在此处输入图像描述

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

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

如何添加新约束:单击要添加约束的事物,然后单击此符号

  1. ...并在各自的“标签”菜单中设置“行”和“换行符”字段,以便标签之间的间距均匀,以便我的详细信息标签可以弯曲成多行。 在此处输入图像描述

它对我有用,允许我在每个单元格中快速地在 UITableView 中拥有不同数量的多行的灵活性,同时格式化自动换行,使其看起来很好,甚至,就像我所期望的“正确的细节”一样自动地。

于 2015-12-31T18:57:13.360 回答
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

一旦你这样做了,你应该准备好了。祝你好运!

于 2012-08-30T15:00:32.950 回答
2

支持最新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
    }
}
于 2019-03-27T10:35:27.170 回答
1

调整视图的框架:textLabel

 CGRect aFrame = cell.textLabel.frame;
 aFrame.size.width = 100;  // for example
 cell.textLabel.frame = aFrame;
于 2011-04-21T15:20:32.273 回答
1

更新了 Gosoftworks Development 的答案。

斯威夫特 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        
        }
    }
}
于 2017-06-14T07:16:59.883 回答
0

创建一个包含 UILabel 的自定义 UITableViewCell ,您可以随意控制它,或者截断分配给基类 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;
}

可能没有“优化”,但它适用于简单的场景。

于 2013-01-30T16:47:51.137 回答
0

1st:设置换行模式

textLabel.lineBreakMode = NSLineBreakByTruncatingTail;

第二:设置你想要的texLabel框架宽度(例如200)

CGRect textFrame = self.textLabel.frame;
CGRect newTextFrame = CGRectMake(textFrame.origin.x, textFrame.origin.y, 200, textFrame.size.height);
self.textLabel.frame = newTextFrame;
于 2014-03-14T05:53:36.897 回答
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;
于 2014-11-11T13:07:11.033 回答
0

我一直在努力解决这个问题,并找到了一个非常简单的答案。我textLabel在左边,有时会把右边推detailText到你根本看不到的地方。

我的解决方案,将Table View Cell styleto Subtitlefrom Left Detailor更改为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()
于 2015-12-22T03:10:47.520 回答
-7

使用 UILabellineBreakMode属性将您的文本限制在您的宽度范围内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;
于 2011-04-21T15:17:23.730 回答