使用UIStackView

时间:2018-04-17 14:51:00

标签: ios swift uitableview uistackview

我在UIImageView内使用UIStackView时会看到一些奇怪的行为,我怀疑有一些明显可以忽略的东西 - 尽管此时我已经尝试了很多东西。 / p>

我正在尝试做的非常简单:从网上下载图片,在UIImageView内设置UIStackViewUIStackView还包含UILabel(我的实际项目包含相当多的UILabels,因此UIStackView的原因。下面的图片有彩色背景,以说明出现问题的地方,我还提供了完整的Playground代码,以便轻松复制/粘贴。

正在下载的图片大于屏幕的宽度/高度,我设置了contentMode = .scaleAspectFitUITableView使用了 tableView.rowHeight = UITableViewAutomaticDimension.estimatedRowHeight。我已设置约束,并且还试图在UIImageView上设置拥抱优先级,但无济于事。我不知道提前确切的细胞高度,细胞高度都会有所不同。

实际发生的事情是,尽管UIImageView上有前导/尾随约束,但UIStackView上的约束,.rowHeight上的.scaleAspectFit以及{ UIImageView上的{1}}。您甚至可以看到(红色)标签的条子,因此我知道UIStackView被固定到contentView的{​​{1}}。

颜色键

  • 橙色:UITableViewCell背景
  • 红色:UILabel背景
  • 绿色:UIImageView背景

enter image description here

UITableViewCell

2 个答案:

答案 0 :(得分:1)

您似乎认为堆栈视图中的图像视图会以某种方式从内到外调整单元格的高度。它没有赢。如果您想使用自动单元格高度,请不要使用堆栈视图(或者添加约束来明确地调整堆栈视图的大小,但我怀疑这会给您带来所需的结果)。

您的代码中堆栈视图的目的是什么?所有堆栈视图都会在困难的情况下为您制定约束。但这不是一个困难的情况。一起可以轻松配置标签和图像视图。

答案 1 :(得分:0)

您只需在此方法中给出估计的行高

import numpy as np

np.random.seed(444)

def loop(b):
    # Could also use for (i, j), val in np.ndenumerate(b)
    p = np.zeros_like(b)
    for i in range(0, n):
        for j in range(0, m):
            r = b[i, j]
            p[i, j] = ((b[:, j] > r).sum())
    return p / n

def noloop(b):
    n = b.shape[0]
    return np.sum(b > b[:, None], axis=-2) / n

n = 10
m = 2
b = np.random.rand(n, m)

assert np.allclose(loop(b), noloop(b))
# True

n = 1000
m = 200
b = np.random.rand(n, m)

%timeit loop(b)
# 1.59 s ± 50.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit -r 7 -n 1 noloop(b)
# 443 ms ± 18.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

assert np.allclose(loop(b), noloop(b))
# True