2

我的要求是当我从 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
4

0 回答 0