【问题标题】:UITableView: Set table header view height based on screen sizeUITableView:根据屏幕大小设置表头视图高度
【发布时间】:2015-09-12 00:49:55
【问题描述】:

我有一个表视图,其中表头视图是通过同一个 xib 中的界面生成器创建的。我想根据屏幕大小设置页眉的高度,例如屏幕高度的 50%。

这是我在 iPhone 4s 上使用静态高度得到的结果:

这是我在 iPhone 6 上得到的:

注意头部的内容是静态的。

我无法使用自动布局为标题设置约束。我试图根据表格视图的高度设置高度约束,但在界面生成器中似乎不可能。控制拖动不起作用。我无法将一条线从表头拖到表格视图,甚至拖到表头本身。

如何根据屏幕大小设置页眉高度?

【问题讨论】:

  • 在界面生成器中为标题视图添加高度约束并 CTRL 将其拖到您的标题文件中以创建一个 IBOutlet。在 viewDidLoad 中,将约束的值设置为yourOutlet.constant=[[UIScreen mainScreen] bounds].size.height/2。在轮换时,您还需要重置常量。
  • 谢谢,但我无法向 uiview 标题视图添加约束,我已更新问题并附上图片,请查看我问题的“编辑”部分
  • 是的,似乎在表头上使用约束存在问题。为您发布了一个简单的工作解决方案。

标签: ios objective-c uitableview autolayout


【解决方案1】:

很遗憾,无法使用自动布局调整表头视图的大小。您可以对标题内的元素使用自动布局,但您必须通过显式设置其框架来指定标题的大小。如果标题的高度是静态的并且在编译时已知,则可以使用 IB。但是,如果高度是动态的或取决于设备(如您的情况),则必须在代码中设置它。

一个非常灵活的解决方案是创建UITableView 的自定义子类,并在layoutSubviews 方法中调整标题的框架。这样,当表格视图调整大小时,标题的大小会自动调整。但是,您必须小心,仅在实际需要更改以避免无限循环时才重新应用标头的框架。

这是在 Objective-C 中的样子:

@interface MyTableView : UITableView
@end

@implementation MyTableView : UITableView

- (void)layoutSubviews {
    [super layoutSubviews];

    if (self.tableHeaderView) {
        UIView *header = self.tableHeaderView;
        CGRect rect = CGRectMake(0, 0, self.bounds.size.width,
                                 self.bounds.size.height / 2);

        // Only adjust frame if needed to avoid infinite loop
        if (!CGRectEqualToRect(self.tableHeaderView.frame, rect)) {
            header.frame = rect;

            // This will apply the new header size and trigger another
            // call of layoutSubviews
            self.tableHeaderView = header;
        }
    }
}

@end

Swift 版本如下所示:

class MyTableView: UITableView {

    override func layoutSubviews() {
        super.layoutSubviews()

        if let header = tableHeaderView {
            let rect = CGRectMake(0, 0, bounds.size.width, bounds.size.height / 2)

            // Only adjust frame if needed to avoid infinite loop
            if !CGRectEqualToRect(header.frame, rect) {
                header.frame = rect

                // This will apply the new header size and trigger 
                // another call of layoutSubviews
                tableHeaderView = header
            }
        }
    }

}

注意,上面的 sn-ps 使用 table view 的 bounds 而不是屏幕大小来计算 header 大小。

更新:请注意,有时需要在设置 tableHeaderView 属性后额外调用 layoutIfNeeded。我遇到了一个问题,即在没有调用 layoutIfNeeded 的情况下将部分标题绘制在标题视图上方。

【讨论】:

    【解决方案2】:

    我已经尝试了以下代码,它似乎适用于 iOS7 和 iOS8。它将标题框架的高度更改为屏幕高度的一半。如果标题必须仅为表格视图区域大小的一半,您可能需要从 /2 之前的屏幕高度中减去导航和状态栏的高度。

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        // Your other code
    
        // Set the table header height
        CGRect headerFrame = self.tableView.tableHeaderView.frame;
        headerFrame.size.height = [[UIScreen mainScreen] bounds].size.height/2;
        self.tableView.tableHeaderView.frame=headerFrame;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2016-12-11
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多