Swift - 使用自动布局时获取视图框架
Posted
技术标签:
【中文标题】Swift - 使用自动布局时获取视图框架【英文标题】:Swift - Get frames of view when auto layout is used 【发布时间】:2022-01-21 16:58:19 【问题描述】:在视图控制器中用作子视图的视图中,我使用自动布局定义了不同的组件。但是,在我的子视图中,我需要访问组件的框架。
这是我的代码:
class CreateChallengeView: AbstractCreateChallengeOrTournamentView
override init(frame: CGRect)
super.init(frame: frame)
setupView(frame: frame)
private func setupView(frame:CGRect)
setNeedsLayout()
/* START SCROLL VIEW */
scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
addSubview(scrollView)
scrollView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: frame.width * (22 / IPHONE8_SCREEN_WIDTH)).isActive = true
scrollView.widthAnchor.constraint(equalToConstant: frame.width * (331 / IPHONE8_SCREEN_WIDTH)).isActive = true
scrollView.topAnchor.constraint(equalTo:self.topAnchor).isActive = true
scrollView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
/* END SCROLL VIEW */
/* START CONTAINER VIEW */
containerView = UIView()
containerView.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(containerView)
containerView.leadingAnchor.constraint(equalTo: self.scrollView.leadingAnchor).isActive = true
containerView.widthAnchor.constraint(equalTo: self.scrollView.widthAnchor).isActive = true
containerView.topAnchor.constraint(equalTo: self.scrollView.topAnchor).isActive = true
containerView.bottomAnchor.constraint(equalTo: self.scrollView.bottomAnchor).isActive = true
containerView.layer.borderColor = UIColor.black.cgColor
containerView.layer.borderWidth = 2
/* END CONTAINER VIEW */
/* START TITLE LABEL*/
titleLabel.translatesAutoresizingMaskIntoConstraints = false
self.containerView.addSubview(titleLabel)
titleLabel.leadingAnchor.constraint(equalTo: self.containerView.leadingAnchor, constant: frame.height * (19 / IPHONE8_SCREEN_HEIGHT)).isActive = true
titleLabel.widthAnchor.constraint(equalToConstant: frame.width * (284 / IPHONE8_SCREEN_WIDTH)).isActive = true
titleLabel.topAnchor.constraint(equalTo: self.containerView.topAnchor, constant: frame.height * (11 / IPHONE8_SCREEN_HEIGHT)).isActive = true
titleLabel.heightAnchor.constraint(equalToConstant: frame.height * (27 / IPHONE8_SCREEN_HEIGHT)).isActive = true
titleLabel.text = NSLocalizedString(CHALLENGE_NAME_TEXT, comment: "")
print(titleLabel.frame) --> (0,0,0,0) How to get frame?
/* END TITLE LABEL */
以我的 titleLabel 为例,如何直接获取框架?
【问题讨论】:
【参考方案1】:除了layoutSubviews
,您不知道自动布局的结果。所以重写它,调用 super,现在你可以做依赖于框架知识的事情了。
【讨论】:
但是,一般来说,如果您在使用自动布局时需要知道任何帧,那么您的自动布局是错误的。 谢谢@matt。let firstLineLayer = UIViewUtil.drawLine(startingPointX: 0, endingPointX: frame.maxX, startingPointY: descriptionTextView.frame.maxY + 20, endingPointY:455) firstLineLayer.strokeColor = UIColor.green.cgColor containerView.layer.addSublayer(firstLineLayer)
需要访问每个组件的 maxY 以在特定视图之后显示一条水平线。为此,我需要框架,因为我不能在 CAShapeLayer 上使用自动布局
否,但您可以在承载形状图层的视图上使用它。
好点。让我试试吧!
有效!天才:) 谢谢以上是关于Swift - 使用自动布局时获取视图框架的主要内容,如果未能解决你的问题,请参考以下文章