gpt4 book ai didi

iphone - UITableViewCell。如何以编程方式将 textLabel 对齐到顶部?

转载 作者:太空狗 更新时间:2023-10-30 03:27:30 28 4
gpt4 key购买 nike

默认情况下,UITableViewCell 实例将标签对 textLabel/detailTextLabel 定位在其父 View 的中心。我更喜欢将这对对齐到单元格的顶部。我如何以编程方式执行此操作?

谢谢,
道格

最佳答案

文档将 -[UIView layoutSubviews] 描述为

"Overridden by subclasses to layout subviews when layoutIfNeeded is invoked. The default implementation of this method does nothing."

该描述并不详尽,但准确无误。在这种情况下,该方法的行为是布局您的 subview 。只要设备方向发生变化,它就会被调用。每当您调用 -setNeedsLayout 时,它也会安排在以后调用。

由于 UIView 的实现什么都不做(我认为 UIControl 也是如此),您可以获得完全的创作自由,可以将 UIView 子类 subview 放置在您想要的任何位置。

在子类化 UITableViewCell 时,您有几个选项可以尝试:

  1. 覆盖 -layoutSubviews 和
    1. 操纵内置 textLabel 和 -detailLabel View 的位置。
  2. 覆盖-viewDidLoad,
    1. 创建两个您自己的 UILabel 以提供文本和详细文本,
    2. 将它们添加到 self.contentView,并且
    3. 覆盖 -layoutSubviews 以操纵自定义 UILabel View 的位置

related SO question 中,建议避免 #1,操作内置的 textLabel 和 detailTextLabel。

一个更可靠的选择是做这样的事情:


@interface MyTableViewCell : UITableViewCell {
UILabel *myTextLabel;
UILabel *myDetailTextLabel;
}
// ... property declarations
@end

@implementation MyTableViewCell
@synthesize myTextLabel, myDetailTextLabel;

- (id) initWithFrame: (CGRect)frame {
self = [super initWithFrame: frame];
if (self) {
myTextLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
[self.contentView addSubview: myTextLabel];

myDetailTextLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
[self.contentView addSubview: myDetailTextLabel];
}
return self;
}

- (void) dealloc {
[myTextLabel release];
[myDetailTextLabel release];
[super dealloc];
}

- (void) layoutSubviews {

// Let the super class UITableViewCell do whatever layout it wants.
// Just don't use the built-in textLabel or detailTextLabel properties
[super layoutSubviews];

// Now do the layout of your custom views

// Let the labels size themselves to accommodate their text
[myTextLabel sizeToFit];
[myDetailTextLabel sizeToFit];

// Position the labels at the top of the table cell
CGRect newFrame = myTextLabel.frame;
newFrame.origin.x = CGRectGetMinX (self.contentView.bounds);
newFrame.origin.y = CGRectGetMinY (self.contentView.bounds);
[myTextLabel setFrame: newFrame];

// Put the detail text label immediately to the right
// w/10 pixel gap between them
newFrame = myDetailTextLabel.frame;
newFrame.origin.x = CGRectGetMaxX (myTextLabel.frame) + 10.;
newFrame.origin.y = CGRectGetMinY (self.contentView.bounds);
[myDetailTextLabel setFrame: newFrame];
}

@end

在 MyTableViewCell 中,您将忽略内置文本标签并使用您自己的自定义 UILabel。您可以完全控制它们在表格 View 单元格的内容矩形中的定位。

我遗漏了很多东西。在使用文本标签进行自定义布局时,您需要考虑:

  • 找出您自己的布局算法。

    我使用上面的布局算法调整自定义 UILabel 的大小以适合其文本内容,然后将它们并排放置。您可能需要更适合您的应用的内容。

  • 将自定义标签保留在内容 View 中。

    在 -layoutSubviews 中,您可能需要逻辑来保持自定义 UILabel 的大小和位置,以便它们不会落在内容矩形的边界之外。根据我幼稚的布局逻辑,放入 UILabel(或两者)中的任何长文本都可能导致标签定位在内容 View 边界之外。

  • 如何处理 -viewDidLoad/-viewDidUnload。

    如上编码,该子类不处理从 nib 加载的问题。您可能想使用 IB 来布局您的单元格,如果这样做,您需要考虑 -viewDidLoad/-viewDidUnload/-initWithCoder:

关于iphone - UITableViewCell。如何以编程方式将 textLabel 对齐到顶部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3352465/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com