Is it possible to use AutoLayout with UITableView's tableHeaderView?

前端 未结 29 1365
醉梦人生
醉梦人生 2020-11-28 19:51

Since I discovered AutoLayout I use it everywhere, now I\'m trying to use it with a tableHeaderView.

I made a subclass of

29条回答
  •  再見小時候
    2020-11-28 20:30

    You can get autolayout to provide you with a size by using the systemLayoutSizeFittingSize method.

    You can then use this to create the frame for your application. This technique works whenever you need to know the size of a view that uses autolayout internally.

    The code in swift looks like

    //Create the view
    let tableHeaderView = CustomTableHeaderView()
    
    //Set the content
    tableHeaderView.textLabel.text = @"Hello world"
    
    //Ask auto layout for the smallest size that fits my constraints    
    let size = tableHeaderView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
    
    //Create a frame    
    tableHeaderView.frame = CGRect(origin: CGPoint.zeroPoint, size: size)
    
    //Set the view as the header    
    self.tableView.tableHeaderView = self.tableHeaderView
    

    Or in Objective-C

    //Create the view
    CustomTableHeaderView *header = [[CustomTableHeaderView alloc] initWithFrame:CGRectZero];
    
    //Set the content
    header.textLabel.text = @"Hello world";
    
    //Ask auto layout for the smallest size that fits my constraints
    CGSize size = [header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    
    //Create a frame
    header.frame = CGRectMake(0,0,size.width,size.height);
    
    //Set the view as the header  
    self.tableView.tableHeaderView = header
    

    It should also be noted that in this particular instance, overriding requiresConstraintBasedLayout in your subclass, does result in a layout pass being performed, however the results of this layout pass are ignored and the system frame set to the width of the tableView and 0 height.

提交回复
热议问题