我对iOS开发相对较新,我的约束技能处于基本水平。我有一组像这样的标签
然而公司名称和地址第2行并不总是必需的,因此在某些情况下会隐藏它们,但是当它们存在时我不知道如何推动其他标签向上,以便填充隐藏标签创建的空间。
非常感谢你们能解决这个问题。
答案 0 :(得分:2)
HI Joel为什么不在表格视图单元格中尝试堆栈视图并设置
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
stackview和tableview将为您处理一切。
答案 1 :(得分:1)
如果您正在使用约束,那么顶部标签应该有前导,尾随和顶部到superview。
现在这个标签的高度取决于它的字体和文字。如果它的文本为空,那么它的高度将为零,这是你基本上想要的。
现在,下一个标签最好是前导和尾随到superview(或它上面的标签),然后在它之前标注垂直间距。这意味着它将低于第一个。如果第一个没有文本,它将在最顶层。
现在对所有其他标签使用垂直偏移约束对另一个标签进行相同操作。
注意您正在做什么似乎更适合使用UITableView
或堆栈视图。但是如果你想要约束,那么这就是程序。
如果事情变得复杂,您还可以将约束拖到代码中并手动操作它们。例如:
self.companyNameHeightConstraint.constant = myDataMode.companyName.isEmpty == true ? 0.0 : 50.0
编辑:由于根据一些外部标志显示字段有点不清楚,或者如果它们存在则显示这些字符串我将添加一个带外部标志的最小表视图过程:
@interface TableViewController () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSString *companyName;
@property (nonatomic, strong) NSString *address1;
@property (nonatomic, strong) NSString *address2;
@property (nonatomic, readonly) BOOL isAddress2Shown;
@property (nonatomic, readonly) BOOL isCompanyNameShown;
@end
@implementation TableViewController
- (NSArray *)generateDsiaplyableStrings {
NSMutableArray *array = [[NSMutableArray alloc] init];
if(self.name) [array addObject:self.name];
if(self.lastName) [array addObject:self.lastName];
if(self.companyName && self.isCompanyNameShown) [array addObject:self.companyName];
if(self.address1) [array addObject:self.address1];
if(self.address2 && self.isAddress2Shown) [array addObject:self.address2];
return array;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self generateDsiaplyableStrings].count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSArray *items = [self generateDsiaplyableStrings];
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil];
cell.textLabel.text = items[indexPath.row];
return cell;
}
@end