Документах описывают - [UIView layoutSubviews], как
"Overridden by subclasses to layout subviews when layoutIfNeeded is invoked. The default implementation of this method does nothing."
Это описание не уточнял, но точно. В этом случае поведение метода заключается в компоновке ваших подзонов. Он будет вызываться в любое время, когда меняется ориентация устройства. Он также планируется для последующего вызова, когда вы вызываете -setNeedsLayout.
Поскольку реализация UIView ничего не делает (и я предполагаю то же самое для UIControl), вы получаете полную свободу творчества, чтобы подзаголовки подкласса UIView располагались там, где вы хотите.
В подклассов в UITableViewCell, у вас есть несколько вариантов, чтобы попробовать:
- Переопределить -layoutSubviews и
- манипулируют положением встроенного TextLabel и -detailLabel взглядов.
- Override -viewDidLoad,
- создать два ваших собственных UILabels, чтобы предоставить текст и подробный текст,
- добавить их в self.contentView и
- переопределение -layoutSubviews манипулировать положение из пользовательских UILabel просмотров
В related SO question, в Reco чтобы избежать # 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, вы бы игнорировать встроенные текстовые метки и использовать свои собственные UILabels. Вы берете полный контроль над позиционированием их в пределах содержимого rect ячейки таблицы.
Я оставляю много вещей. При выполнении индивидуальной компоновки с текстовыми надписями вы хотели бы рассмотреть:
Вычисление собственного алгоритма компоновки.
Я использую алгоритм компоновки выше, который изменяет размеры пользовательских UILabels, чтобы соответствовать их текстовому контенту, а затем размещает их бок о бок. Скорее всего, вам понадобится нечто более специфичное для вашего приложения.
Сохранение пользовательских меток в пределах содержимого.
In -layoutSubviews, вы можете захотеть, чтобы логика сохраняла пользовательские UILabels размером и позиционированием так, чтобы они не выходили за границы содержимого rect. С моей наивной логикой компоновки любой длинный текст, упавший в UILabel (или оба), может привести к тому, что метки будут размещены прямо из границ представления содержимого.
Как обращаться с -viewDidLoad/-viewDidUnload.
Как указано выше, этот подкласс не обрабатывает загрузку с наконечника. Вы можете использовать IB макет вашей ячейки, и если вы делаете, вы должны думать о -viewDidLoad/-viewDidUnload/-initWithCoder:
Это вопрос, связанный с Iphone? –
Да. UITableViewCell вместе с UITableView и UITableViewController уникальны для iPhone OS. Нет? – dugla
Тогда почему не вопрос с меткой iphone? Пожалуйста, позаботьтесь о мечении, чтобы другие могли воспользоваться вашими вопросами. –