【问题标题】:How to remove empty space above a UITableView?如何删除 UITableView 上方的空白空间?
【发布时间】:2016-02-13 13:20:35
【问题描述】:

所以我使用UITableView 来显示有关不同电影的信息。

在 VC 的顶部,我有一个 UIImage,它位于 UIView 的内部。然后我的桌子就在下面。该表当前位于图像的底部(这是我想要的),见下文:

问题

我按照教程添加了一个简单的效果,所以当用户拉下tableView时,图像会放大。您可以通过在此处查看教程来了解我的意思:See here

这一切都很好,并给了我想要的效果,然而,现在它在图像下方添加了一个空白区域,请参见下图:

一切仍然正常,效果按预期工作,但这个空间现在在那里 - 我真的不想要。

该 VC 的情节提要中的设置如下:

我添加的制作效果的代码如下:

private let KTableHeaderHeight: CGFloat = 160.0 // which is the height of my UIImage
var headerView: UIView!

override func viewDidLoad() {

    super.viewDidLoad()

    headerView = tableView.tableHeaderView
    tableView.tableHeaderView = nil
    tableView.addSubview(headerView)

    tableView.contentInset = UIEdgeInsets(top: KTableHeaderHeight, left: 0, bottom: 0, right: 0)
    tableView.contentOffset = CGPoint(x: 0, y: -KTableHeaderHeight)
    updateHeaderView()

}

然后:

func updateHeaderView() {

    var headerRect = CGRect(x: 0, y: -KTableHeaderHeight, width: tableView.bounds.width, height: KTableHeaderHeight)
    if tableView.contentOffset.y < -KTableHeaderHeight {

        headerRect.origin.y = tableView.contentOffset.y
        headerRect.size.height = -tableView.contentOffset.y

    }

    headerView.frame = headerRect

}

override func scrollViewDidScroll(scrollView: UIScrollView) {

    updateHeaderView()

}

如果我注释掉我添加的所有代码,它看起来又很好,所以我猜是这段代码导致了空间。

我真的很想了解为什么会形成这种差距,以及如何消除它,仍然使用添加的代码来制作图像放大效果。

更新

我的 UIImageView 布局属性:

【问题讨论】:

  • 标题中的imageView 有哪些布局属性?
  • 好吧,阅读代码我会放弃我的答案

标签: ios swift uitableview uiview uiimageview


【解决方案1】:

您的问题可能是private let KTableHeaderHeight: CGFloat = 160.0 行,它不等于标题中imageView 的高度。

你需要找出imageView缩放后的固定高度,可以通过原始图像高度乘以视图宽度/原始图像宽度得到,并将imageView高度和private var KTableHeaderHeight: CGFloat设置为价值。

【讨论】:

  • 好吧,好吧,我的图像设置为 375x160 的固定尺寸 - 那么您建议我应该将“KTableHeaderHeight”设置为什么?谢谢
  • 看,这不适用于屏幕尺寸不是 750 像素宽的设备。您能否仍然显示imageView 的布局属性是什么。我假设您使用的是Aspect Fill 模式是否正确?
  • @Nick89 "你还能显示 imageView 的布局属性是什么"吗?
  • 当然,当我回到笔记本电脑时,我可以用这个更新问题。我唯一修改的是 Aspect 填充模式。提前致谢
  • 您好,我添加了一张图片,显示了所要求的图片属性,谢谢
【解决方案2】:

如果您使用分组的 UITableView,那么它会为该组腾出空间,不知道如何摆脱它。您可能需要考虑将其设为计划 UITableView,然后通过委托创建所需的部分标题

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    // create UIView here
}

但是,在使用示例项目之后,您似乎可以调整顶部的 kTableHeightHeader 变量以调整以隐藏顶部标题。

我修改了示例项目,所以你可以看到它here

【讨论】:

  • 您好,我已经添加了这些约束。为了检查这一点,我刚刚删除了它们并重新添加了它们,确保它们是正确的,它们是正确的,但没有任何区别。
  • @Nick89 愚蠢的问题是图像的高度是 160?还是小一点
  • 嗨。是的,我的图像高度是 160
  • @Nick89 我会尝试调试视图层次结构并查看问题是否是图像没有恢复到正确的视图大小比它开始时大。无论是哪一个,您都可以通过在 scrollviewDidEndDecellerating 中添加正确的大小来强制它返回
  • 我仔细看了看,一步一步修改,但没发现问题。我还在scrollViewDidEndDecelerating 函数中添加了您的代码,但没有任何区别:(
【解决方案3】:

斯威夫特代码:

tableView.tableFooterView = UIView()

Objective C代码:

tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

【讨论】: