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 - 使用自动布局时获取视图框架的主要内容,如果未能解决你的问题,请参考以下文章

从 Xib 加载视图在自动布局后调整框架子视图的大小

自动布局子视图在 Swift 4 中添加问题

隐藏视图时,自动布局中的 Swift 约束不会改变

Swift - 如何对 ScrollView 中的项目使用自动布局?

自动布局 swift 在标签上无法正常工作

Xcode 7.3 (swift 2) 中的自动布局