如何调整添加为UITableViewController标头的UIView的高度

时间:2016-05-26 08:52:58

标签: ios xcode uitableview uiview storyboard

我将UIView拖到了UITableViewController的UITableView的标题中,这个视图非常适合作为表格的标题,但是具有异常高度,它都在故事板内完成,我想知道如何控制它的高度。无论我在Storyboard中设置的高度是什么,它都不会影响,它总是显示相同的高度。参见附图,灰色部分是UIView作为标题。

enter image description here

4 个答案:

答案 0 :(得分:3)

UITableView中有两种类型的标题

  1. UITableView标题
  2. UITableView节标题
  3. 假设你在谈论第一个案例。

    静态标题视图高度

    如果您的标题具有静态高度并且它放在表格视图内的sotrybaord中,您可以在尺寸检查器中提供高度。

    enter image description here

    动态页眉查看高度

    如果标题高度是动态的,则需要采用编程方法。

    1. 创建一个标题,所有子视图及其约束,将其连接到表视图控制器中的headerView属性。

    2. 创建一个方法updateSizeForHeaderView,它将根据tableview宽度和标题内的内容更新标题视图高度。

    3. updateSizeForHeaderView致电viewWillLayoutSubviews,以便在屏幕旋转时更新标题视图。

    4. viewDidLoad设置标题tableView.tableHeaderView = headerView

    5. 多数人。

      class TableViewController: UITableViewController {
      
          @IBOutlet var headerView : UIView!
      
          override func viewDidLoad() {
              super.viewDidLoad()
              tableView.tableHeaderView = headerView
          }
      
          override func viewWillLayoutSubviews() {
              updateSizeForHeaderView(inTableView: tableView)
          }
      
          func updateSizeForHeaderView(inTableView tableView : UITableView) {
              let size = headerView.systemLayoutSizeFittingSize(tableView.frame.size, withHorizontalFittingPriority: UILayoutPriorityRequired, verticalFittingPriority: UILayoutPriorityDefaultLow)
              headerView.frame.size = size
          }
      
          override func didReceiveMemoryWarning() {
              super.didReceiveMemoryWarning()
              // Dispose of any resources that can be recreated.
          }
      
          // MARK: - Table view data source
      
          override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
              // #warning Incomplete implementation, return the number of rows
              return 5
          }
      
      
          override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
              let cell = tableView.dequeueReusableCellWithIdentifier("cell_ID", forIndexPath: indexPath)
      
              // Configure the cell...
      
              return cell
          }
      
      }
      

      enter image description here

答案 1 :(得分:2)

扩展@BangOperator答案,之后需要在表视图上重新分配标题,否则您可能会遇到奇怪的行为...这迫使表视图进行适当的更新

...  
@property (nonatomic, assign) CGSize lastTableViewHeaderSize;
@property (nonatomic, assign) BOOL tableViewHeaderSizeChanged;

@end


- (void)viewWillLayoutSubviews {

    [super viewWillLayoutSubviews];

    CGSize size = [self.tableView.tableHeaderView systemLayoutSizeFittingSize:self.tableView.bounds.size withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityDefaultLow];

    if (!CGSizeEqualToSize(size, self.lastTableViewHeaderSize)) {

        CGRect frame = self.tableView.tableHeaderView.frame;
        frame.size = size;
        self.tableView.tableHeaderView.frame = frame;
        self.tableViewHeaderSizeChanged = YES;

    }

}

- (void)viewDidLayoutSubviews {

    [super viewDidLayoutSubviews];

    if (self.tableViewHeaderSizeChanged) {
        self.tableViewHeaderSizeChanged = NO;
        self.tableView.tableHeaderView = self.tableView.tableHeaderView;
    }

}

答案 2 :(得分:1)

这可能有效:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 30;
}

答案 3 :(得分:0)

请做以下可能对您有所帮助。 enter image description here

通过编程方式

  

self.automaticallyAdjustsScrollViewInsets = NO;

<强> EDITED

self.tableView.contentInset = UIEdgeInsetsMake(-36, 0, 0, 0);