ios - resizing - Ajuste la altura de UIView a su contenido con AutoLayout
uitableviewautomaticdimension (1)
Estoy usando la función iOS 6 AutoLayout con Masonry DSL para organizar vistas dentro de UITableViewCell. Esta es la disposición del diseño que quiero lograr:
El containerView
es un contenedor virtual que debe adaptar dinámicamente su tamaño para ajustarse a su contenido. Con mi implementación actual, esto es lo que obtuve en su lugar:
Parece que containerView
se centró verticalmente correctamente, pero tiene ancho y alto cero, por lo que no aparece correctamente. ¿Cómo puedo instruir a containerView
para que ajuste su tamaño a su contenido? Los fragmentos de código se adjuntan a continuación.
¡Gracias!
Inicializador de UITableViewCell
- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier]) {
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.font = [UIFont boldSystemFontOfSize:[UIFont smallSystemFontSize]];
self.titleLabel.text = @"ノートタイトル";
self.coverImage = [[UIView alloc] init];
self.coverImage.backgroundColor = [UIColor carrotColor];
self.avatarImage = [[UIView alloc] init];
self.avatarImage.backgroundColor = [UIColor emerlandColor];
self.authorLabel = [[UILabel alloc] init];
self.authorLabel.font = [UIFont systemFontOfSize:[UIFont smallSystemFontSize]];
self.authorLabel.text = @"著者の名前";
self.containerView = [[UIView alloc] init];
self.containerView.backgroundColor = [UIColor lightGrayColor];
[self.containerView addSubview:self.titleLabel];
[self.containerView addSubview:self.avatarImage];
[self.containerView addSubview:self.authorLabel];
[self.contentView addSubview:self.containerView];
[self.contentView addSubview:self.coverImage];
self.selectionStyle = UITableViewCellSelectionStyleNone;
[self updateConstraintsIfNeeded];
}
return self;
}
UITableViewCell updateConstraints
- (void)updateConstraints
{
[super updateConstraints];
[self.coverImage mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.contentView).with.offset(20);
make.top.equalTo(self.contentView).with.offset(5);
make.bottom.equalTo(self.contentView).with.offset(-5);
make.width.equalTo(self.coverImage.mas_height).multipliedBy(0.75);
}];
[self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.coverImage.mas_right).with.offset(10);
make.centerY.equalTo(self.contentView);
}];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.containerView);
make.top.equalTo(self.containerView);
}];
[self.avatarImage mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.titleLabel.mas_bottom).with.offset(5);
make.left.equalTo(self.titleLabel);
make.width.equalTo(@20);
make.height.equalTo(@20);
}];
[self.authorLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.avatarImage.mas_right).with.offset(5);
make.centerY.equalTo(self.avatarImage);
}];
}
Descubrí la solución a mi propia pregunta. Aparentemente, para que containerView
cambie su tamaño dinámicamente, debemos asegurarnos de que cada uno de los elementos dentro de ellos esté conectado rígidamente entre sí y con los bordes de la supervista (es decir, containerView
). Por ejemplo, en VFL debería ser algo como esto: "V:|-10-[child1]-5-[child2]-5-|"
Entonces, en mi caso, agrego una nueva restricción make.bottom.equalTo(self.containerView)
a avatarImage
y ahora la supervista sabe cómo elevarse sola.