我目前正在尝试访问我之前设置锚点的视图的高度。例如,我在ViewController中使用以下内容设置searchTable
的左,右,顶部和底部锚点:
searchTable.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
searchTable.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
searchTable.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
searchTable.bottomAnchor.constraint(equalTo: menuBar.topAnchor).isActive = true
searchTable
是我创建的类的对象,它继承自UIView并且在其中有一个UIImageView。我通过在init函数中使用以下内容来约束UIImageView:
imageView.topAnchor.constraint(equalTo: topContainer.topAnchor, constant: 10).isActive = true
imageView.leftAnchor.constraint(equalTo: topContainer.leftAnchor, constant: 10).isActive = true
imageView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: topContainerMultiplier * imageProfileMultiplier).isActive = true
imageView.widthAnchor.constraint(equalTo: self.heightAnchor, multiplier: topContainerMultiplier * imageProfileMultiplier).isActive = true
其中:
let topContainerMultipler: Double = 1 / 7
let imageProfileMultipler: Double = 1 / 5
在searchTable
的初始化函数中,我尝试将角半径设置为图像大小的一半。我尝试使用self.frame.height
,self.frame.size.height
,self.bounds.height
并获取.constant
约束的self.heightAnchor
值,但都返回0.
我认为有一个解决办法可以解决这个问题,但我找不到它。
答案 0 :(得分:3)
您在定义约束后查询视图框架的高度,但在布局实际将这些约束解析为框架矩形之前。一种方法是调用class Splitter {
public List<String> words = new ArrayList<>();
public List<Integer> counts = new ArrayList<>();
public void accept(String s) {
if(s.contains("of")) {
counts.add(s.split(" ").length);
} else if(s.contains("for")) {
words.add(s.substring(s.indexOf("for")));
}
}
public Splitter merge(Splitter other) {
words.addAll(other.words);
counts.addAll(other.counts);
return this;
}
}
Splitter collect = strs.stream().collect(
Collector.of(Splitter::new, Splitter::accept, Splitter::merge)
);
System.out.println(collect.counts);
System.out.println(collect.words);
以强制布局立即发生,然后使用layoutIfNeeded
。 init方法可能不适合这样做,而不是在控制器上的view.frame.size.height
内。或者您可以在viewDidLoad
中执行此操作,以便在每次更新视图布局时重新计算角半径(在这种情况下,您不需要viewDidLayoutSubviews
)。
答案 1 :(得分:0)
如果您已经使用了top,bottom,leading和trailing,请不要使用高度限制。
尝试通过添加背景颜色或使用调试视图层次结构按钮直观地调试视图。
要获得视图的高度,您应该使用view.frame.size.height
编辑(已编辑OP问题)
您的问题是,当您刚刚初始化但尚未显示时,您尝试访问对象高度。您应该创建一个更新UI的函数,并在加载视图后调用它。