【发布时间】:2011-04-14 06:59:27
【问题描述】:
我想让我的 UITableViewCell 中的文本稍微靠右一点。换句话说,我想要一个 x 偏移量。这甚至可能吗?我是否必须因此而创建一个自定义单元格?
【问题讨论】:
-
您可以做的一个简单的事情是在文本前添加几个空格。也许这可以帮助你
标签: iphone objective-c uitableview
我想让我的 UITableViewCell 中的文本稍微靠右一点。换句话说,我想要一个 x 偏移量。这甚至可能吗?我是否必须因此而创建一个自定义单元格?
【问题讨论】:
标签: iphone objective-c uitableview
您可以使用cell.indentationLevel 和cell.indentationWidth,而不是为此自定义 UITableViewCell。
【讨论】:
Amount of indentation = cell.indentationLevel (default 0) * cell.indentationWidth (default 10.0 points)。仅供参考。
你可以试试这个:
[cell setIndentationLevel:SOME_NUMBER];
[cell setIndentationWidth:SOME_OTHER_NUMBER];
【讨论】:
cell.contentView。其次,应该在if (cell == nil) 检查中添加新标签,这样您就不会将标签添加到已经拥有它们的出列单元格实例中。在标签上设置标签,以便在获取单元格后检索它,以便设置文本。
一个简单的解决方案是您可以更改 textLabel 的框架。
CGRect textLabelFrame = cell.textLabel.frame;
textLabelFrame.origin.x += xOffset;
textLabelFrame.size.width -= xOffset;
cell.textLabel.frame = textLabelFrame;
我还通过创建自定义 UILabel 来完成此操作,该 UILabel 支持类似于 UIButton 的 edgeInsets。这是一个更好的解决方案 b/c 您可以将标签布局为正确的大小,但如果您有简单的需求,上述方法将起作用。
[编辑 1/2:使用 CGRect 修复错字]
[编辑 3:修正错字设置修改框架]
[编辑 4:需要一个简单的子类]
过失。我错了,您可以在tableView:cellForRowAtIndexPath 中执行此操作。 UITableViewCell 布局发生在 tableView 委托/数据源有机会自定义单元格之后。我已经测试了下面的实现,它可以工作。
按照我上面说的做,但是创建一个UITableViewCell 的(简单)子类,在layoutSubviews 中添加xOffset。如果这样做,您还可以添加一个xOffset 属性,您可以在tableView:cellForRowAtIndexPath: 中设置该属性。
@implementation XOffsetCell
// assumes property xOffset is defined and synthesized
- (void) layoutSubviews
{
[super layoutSubviews];
CGRect textLabelFrame = cell.textLabel.frame;
textLabelFrame.origin.x += self.xOffset;
textLabelFrame.size.width -= self.xOffset;
cell.textLabel.frame = textLabelFrame;
}
@end
建议将自定义UILabel 添加到cell.contentView 的解决方案也是一个很好的解决方案。我看到你的评论说它掩盖了内置的textLabel,但这就是重点。您将不再使用内置标签,而是使用自定义标签。
【讨论】:
我不是为了投票,而是想展示@iPhone Monster 提供的代码“应该”是什么样子。他的解决方案是一个有效的选择。如果您像他一样将标签添加到 if (cell == nil) 之后的单元格,您将不断地向出列单元格添加标签。
- (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];
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(50.0f, 10.0f, 150.0f, 20.0f)];
lbl.tag = OffsetLabelTag; // define this as a constant
[cell.contentView addSubview:lbl];
[lbl release];
}
UILabel *lbl = (UILabel *)[cell.contentView viewWithTag:OffsetLabelTag];
[lbl setText:@"test text"];
return cell;
}
【讨论】:
[cell.contentView viewWIthTag:OffsetLabelTag] 访问自定义标签。我还会考虑您是否真的需要从此处的标签中获取值。如果可能,最好从数据模型中获取所需的任何值。
您可以使用自动布局做到这一点:
UITableViewCell *cell = [UITableViewCell new];
cell.textLabel.translatesAutoresizingMaskIntoConstraints = NO;
[cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(indentation)-[textLabel]-(indentation)-|"
options:0
metrics:@{@"indentation": @35}
views:@{@"textLabel": cell.textLabel}]];
或者使用Parus lib:
[cell.contentView addConstraints:(PVVFL(@"H:|-(indentation)-[textLabel]-(indentation)-|")
.withViews(@{@"textLabel": textLabel})
.metrics(@{@"indentation": @35}).asArray)];
【讨论】:
.translatesAutoresizingMaskIntoConstraints = NO;,你就有责任放置所有必要的约束,因此视图位置将为自动布局系统很好地定义。在这种情况下,您还需要指定垂直约束。
其他方式:
- (NSInteger)tableView:(UITableView *)tableView
indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
{
return intOffset; // but is like '\t', not points
}
【讨论】:
还有另一种不太漂亮和聪明的方法:) TableViewCell 中标签的位置取决于分配给 cell.imageView.image 属性的图像大小。因此,如果您希望文本向右移动,您可以在单元格中的图像中添加几个空白像素列。
【讨论】:
基于https://stackoverflow.com/a/5659826/1058199,这是一个 Swift 版本。
这适用于单元格内,仅将 textLabel 移动到右侧。斯威夫特 5.4
override func layoutSubviews() {
super.layoutSubviews()
var textLabelFrame = self.textLabel?.frame
textLabelFrame?.origin.x += 32
textLabelFrame?.size.width -= 32
self.textLabel?.frame = textLabelFrame ?? CGRect.zero
}
【讨论】:
cell.textLabel.textAlignment = UITextAlignmentCenter; 对你来说足够了吗?它可以将文本与中心对齐,为您创造空间
【讨论】: