开发者社区 问答 正文

导致视图重叠的addArrangedSubview

我有一个xib包含stackview叫newContainerView...当我尝试向它添加自定义视图时stackview使用addArrangedSubview它们相互堆积在一起,而不是像预期的那样垂直堆叠。因此,我用完全相同的代码创建了一个简单的测试项目,它运行得非常完美。我增加了高度和宽度约束,更改了translatesAutoresizingMaskIntoConstraints并比较这两个项目之间的每个设置。十次。

唯一的区别是,在实际项目中,容器视图被添加到UIViews...在示例项目中,只显示视图。但我看不出这会有什么不同的行为。

有人能解释一下为什么这段代码不起作用吗?

enter image description here

func makePhotoSheet(quote: Quote) {
   let newContainerView = ContainerView(frame: CGRect(x: 0, y: 0, width: 612, height: 792))

   //In the sample project, this replaces the line above
   let newContainerView = ContainerView(frame: view.bounds)
   view.addSubview(newContainerView)
   //End sample project code

   let testView1 = TestView()
   let testView2 = TestView()

   testView1.photo.image = UIImage(named: "bird")
   testView1.photoCaption.text = "Bird"
   testView1.heightAnchor.constraint(equalToConstant: 200).isActive = true
   testView1.widthAnchor.constraint(equalToConstant: 1).isActive = true
   testView1.translatesAutoresizingMaskIntoConstraints = false

   testView2.photo.image = UIImage(named: "heart")
   testView2.photoCaption.text = "Heart"
   testView2.heightAnchor.constraint(equalToConstant: 200).isActive = true
   testView2.widthAnchor.constraint(equalToConstant: 1).isActive = true
   testView2.translatesAutoresizingMaskIntoConstraints = false

   containerView.photoViewStackView.addArrangedSubview(testView1)
   containerView.photoViewStackView.addArrangedSubview(testView2)

   pdfPages.append(containerView)
}
这是自定义视图的XIB类,后面跟着XIB

class PhotoView: UIView {

   @IBOutlet var contentView: UIView!
   @IBOutlet weak var photo: UIImageView!
   @IBOutlet weak var photoCaption: UITextView!

   override init(frame: CGRect) {
      super.init(frame: frame)
      setup()
   }

   required init?(coder aDecoder: NSCoder) {
      super.init(coder: aDecoder)
      setup()
   }

   func setup() {
      Bundle.main.loadNibNamed("PhotoView", owner: self, options: nil)
      contentView.frame = self.bounds
      addSubview(contentView)
   }
}

这是容器视图的XIB类。

class PhotoSheet: UIView {

   @IBOutlet var contentView: UIView!
   @IBOutlet weak var photoViewStackView: UIStackView!

   override init(frame: CGRect) {
      super.init(frame: frame)
      setup()
   }

   required init?(coder aDecoder: NSCoder) {
      super.init(coder: aDecoder)
      setup()
   }

   func setup() {
      Bundle.main.loadNibNamed("PhotoSheet", owner: self, options: nil)
      contentView.frame = self.bounds
      addSubview(contentView)
   }
}

展开
收起
游客5akardh5cojhg 2019-12-05 13:03:09 690 分享 版权
阿里云 AI 助理回答

从你的描述来看,问题可能出在约束冲突或者视图层级结构的设置上。UIStackView 的行为应该是自动管理其子视图的布局,使其垂直或水平堆叠,但当外部约束与 StackView 内部的布局逻辑冲突时,可能会导致你遇到的问题。

以下是一些排查和解决此问题的建议:

  1. 检查约束是否冲突

    • 确保在 ContainerView 中没有其他约束与 StackView 或其子视图的约束产生冲突。例如,如果 photoViewStackView 本身或者其父视图(contentView)上有直接定义高度或宽度的约束,这可能与 StackView 的自动布局逻辑相矛盾。
    • 当你添加自定义视图到 StackView 时,确保这些视图自身的约束设置正确,并且没有与其他视图的约束冲突。你已经为 testView1testView2 设置了固定高度和宽度,这是正确的,但要确认这些约束没有被其他未知约束覆盖或抵消。
  2. TranslatesAutoresizingMaskIntoConstraints 属性

    • 你提到已经设置了 translatesAutoresizingMaskIntoConstraints = falsetestView1testView2 上,这是正确的做法,因为 StackView 会自动管理子视图的布局,不需要它们有自动转换的约束。请确保 ContainerView 和其内部的 contentView 以及 photoViewStackViewtranslatesAutoresizingMaskIntoConstraints 也根据需要正确设置。通常,如果你通过代码或 Interface Builder 手动添加了约束,应将此属性设为 false
  3. 视图层级和加载 XIB

    • 确认在加载 XIB 文件时,视图层次结构正确无误。你已经在 PhotoSheetPhotoViewsetup 方法中手动添加了从 XIB 加载的 contentView,确保这个过程没有导致额外的视图层级或约束混乱。
    • 检查 XIB 文件中的约束是否完全符合预期,特别是 contentView 在其父视图中的约束,以及 photoViewStackViewcontentView 中的约束。
  4. 调试视图层次和约束

    • 使用 Xcode 的“视图调试器”(View Debugger) 来检查运行时的视图层级和约束情况。这可以帮助你直观地看到哪些约束可能存在问题,比如是否有红色警告表示约束冲突。
  5. 测试不同的初始化方法

    • 尝试使用不同方式初始化 newContainerView,比如直接用 Bundle.main.loadNibNamed 而不是先创建一个默认 frame 的实例,看看是否有所改变。
  6. 检查父视图约束

    • 确保 newContainerView 在其父视图中的约束是正确的,尤其是高度和宽度约束,或者确保它能够自由扩展以适应 StackView 的内容。

综上所述,问题很可能是由约束不一致或视图层级设置不当引起的。逐一排查上述方面,应该能帮助你定位并解决问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: