【问题标题】:iOS Swift Constraints not working, subview of UITableView disappears when translatesAutoresizingMaskIntoConstraints = falseiOS Swift 约束不起作用,当 translatesAutoresizingMaskIntoConstraints = false 时 UITableView 的子视图消失
【发布时间】:2021-10-21 16:11:25
【问题描述】:

我已经处理了以编程方式创建约束的问题,但这次有些东西不起作用,我不知道它是什么。

override func viewDidLoad() {
    super.viewDidLoad()

    let imageview = UIImageView(image: UIImage(named: "dollarsign"))
    //imageview.translatesAutoresizingMaskIntoConstraints = false
    
    imageview.backgroundColor = UIColor(red: 0, green: 1, blue: 0, alpha: 0.10)
    self.view.addSubview(imageview)
    self.view.bringSubviewToFront(imageview)
    
    imageview.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 0).isActive = true
    imageview.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0).isActive = true
    
    imageview.widthAnchor.constraint(equalToConstant: 320).isActive = true
    imageview.heightAnchor.constraint(equalToConstant: 480).isActive = true

imageview.translatesAutoresizingMaskIntoConstraints = false 被注释掉时,图像视图会显示出来,并以其自然宽度、高度定位在 (0,0) 处。

但我不希望它自动为我创建约束,所以当我取消注释 imageview.translatesAutoresizingMaskIntoConstraints = false 以让我的编程约束开始...然后 UIImageView 消失:

我做错了什么?

编辑:我不明白,但出于某种原因,当我让约束控制时,它会将其定位在 -320,-480,即使我已经创建了约束以将其连接到尾随和底部锚点。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    print("image view frame: \(imageview.frame)")
}

图像视图帧:(-320.0, -480.0, 320.0, 480.0)

【问题讨论】:

  • 根据您的限制,图像视图不应位于 (0, 0)。不应该在右下角吗?为什么你期望它在 (0, 0)?而且我无法重现这种行为。当我取消注释= false 时,图像视图出现在右下角。尝试在一个全新的项目中重现它。
  • 哦,等等,您正在使用显示一堆东西的表格视图,因此您实际上需要向下滚动一点才能真正看到“右下角”。试试看。
  • @kenny Wyland 删除宽度/高度约束并给出上下约束。
  • @Sweeper 我不希望它位于 0,0,但这是它通常默认为无约束的位置。我希望图像被固定在底部和右侧,这就是我设置底部和尾随约束的原因。我不希望它被限制在视图的顶部。问题是当我取消注释 = false 时,图像视图消失了。
  • 那是 TableViewController 吗?如果是这样,那么主视图就是你的表格视图,如果你向它添加子视图,你会得到奇怪的行为。

标签: ios swift nslayoutconstraint


【解决方案1】:

代码应该可以正常工作

imageview.translatesAutoresizingMaskIntoConstraints = false.

这是您在以编程方式创建约束时应该始终做的事情。它不起作用的唯一原因必须是因为某些视图位于您的 ImageView 之上,而您没有看到它。也许你可以调试视图层次结构。

如果您的基本控制器是 UITableViewController,那就另当别论了。

你需要在tableview中添加一个backgroundView,然后在其中添加UIImageView。下面是例子:

class ViewController: UITableViewController {
    var imageview:UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
      
        imageview = UIImageView(image: UIImage(named: "test"))
        imageview.backgroundColor = .systemPink
        
        imageview.translatesAutoresizingMaskIntoConstraints = false
        
        imageview.backgroundColor = UIColor(red: 0, green: 1, blue: 0, alpha: 0.10)
        let bgView = UIView(frame: self.tableView.bounds)
        self.tableView.backgroundView = bgView
        bgView.addSubview(imageview)
        bgView.bringSubviewToFront(imageview)
        
        imageview.trailingAnchor.constraint(equalTo: bgView.trailingAnchor, constant: 0).isActive = true
        imageview.bottomAnchor.constraint(equalTo: bgView.bottomAnchor, constant: 0).isActive = true
        
        imageview.widthAnchor.constraint(equalToConstant: 320).isActive = true
        imageview.heightAnchor.constraint(equalToConstant: 480).isActive = true
    }
}

【讨论】:

  • 我正在使用 UITableViewController 如果我使用背景视图,那么我的 ImageView 会显示在单元格后面并被它遮挡。而且我不想将单元格的背景颜色设置为清除,因为我想要部分标题的浅灰色/蓝色,所以表格视图的背景颜色是灰色/蓝色。如果单元格是清晰的,那么灰色/蓝色也会显示出来。
【解决方案2】:

如果我的self.view 只是一个UIView,我的原始代码本来可以工作,但它是一个UITableView,因为UITableView 是一个UIScrollView,它的布局锚点是不同的。

我需要将我的约束锚定到self.tableView.frameLayoutGuide.trailingAnchorself.tableView.frameLayoutGuide.bottomAnchor,然后它就完美地工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多