我的要求是当我从 UITableViewCell 内的 UIStackView 中删除对象时,单元格高度应变为 0,即折叠。由于从情节提要添加约束,它不允许单元格完全折叠,而是将标准高度设置为 44 点。所以我只能使用情节提要折叠到 1px 高度。
考虑 Stack View 高度根据里面的内容调整,当添加到 UITableView 单元格 contentView 时,它允许自动重新调整单元格高度。
是否可以完全折叠单元格,即以编程方式将高度设置为 0,因为情节提要约束不允许达到 0 高度。如果我使用 -heightForRowAtIndexPath,那么我不会从 tableView 的 AutomaticDimension 中受益。
我尝试以编程方式将约束添加到单元格内的stackView,但即使在删除stackView 内的对象后它仍保留其高度。
#import "RootTableViewController.h"
@interface RootTableViewController ()
@property (strong, nonatomic) IBOutlet UIStackView *stackView;
@property (strong, nonatomic) IBOutlet UIDatePicker *datePicker;
@end
@implementation RootTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
// tableView automatic dimension
self.tableView.estimatedRowHeight = 44;
self.tableView.rowHeight = UITableViewAutomaticDimension;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 4;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
if (indexPath.row == 2) {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"pickerCell" forIndexPath:indexPath];
[_stackView addArrangedSubview:_datePicker];
_stackView.translatesAutoresizingMaskIntoConstraints = NO;
[cell.contentView addSubview:_stackView];
NSLayoutConstraint *width =[NSLayoutConstraint
constraintWithItem:_stackView
attribute:NSLayoutAttributeWidth
relatedBy:0
toItem:cell.contentView
attribute:NSLayoutAttributeWidth
multiplier:1.0
constant:0];
NSLayoutConstraint *height =[NSLayoutConstraint
constraintWithItem:_stackView
attribute:NSLayoutAttributeHeight
relatedBy:0
toItem:cell.contentView
attribute:NSLayoutAttributeHeight
multiplier:1.0
constant:0];
NSLayoutConstraint *top = [NSLayoutConstraint
constraintWithItem:_stackView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:cell.contentView
attribute:NSLayoutAttributeTop
multiplier:1.0f
constant:0.f];
NSLayoutConstraint *leading = [NSLayoutConstraint
constraintWithItem:_stackView
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:cell.contentView
attribute:NSLayoutAttributeLeading
multiplier:1.0f
constant:0.f];
[cell.contentView addConstraints:@[width, height, top, leading]];
[cell setNeedsLayout];
[cell layoutIfNeeded];
return cell;
}
cell.textLabel.text = @"Cell";
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[_stackView removeArrangedSubview:_datePicker];
[_datePicker removeFromSuperview];
}
@end