自定义UIView重绘视图控制器

时间:2018-09-22 08:23:37

标签: ios swift uiview

我的第一篇文章,所以我希望自己做对了。

我有一个自定义UIView,其中包含自定义UIButton的数组。

我已经重写了func draw(_ rect:CGRect),它具有以下代码:

  override func draw(_ rect: CGRect) {

    // remove all buttons currently on the bar
    self.subviews.forEach { $0.removeFromSuperview() }

    // process all buttons that are not hidden
    var i = 0
    for btn in buttons {
      if !btn.button.isHidden {
        self.addSubview(btn.button)

        // set constraints with SnapKit
        btn.button.snp.makeConstraints { (c) in
          c.size.equalTo(buttonSize)
          c.left.equalToSuperview().offset(padding.width + (isVertical ? 0 : (i * buttonSize.width)))
          c.top.equalToSuperview().offset(padding.height + (isVertical ? (i * buttonSize.height) : 0))
        }

        i += 1
      }
    }

    // set button bar's constraints
    snp.updateConstraints { (c) in
      if isVertical {
        c.height.equalTo(max(visibleCount, 1) * buttonSize.height + 2 * padding.height)
      } else {
        c.width.equalTo(max(visibleCount, 1) * buttonSize.width + 2 * padding.width)
      }
    }

  }

每当我执行setNeedsLayout()时,它都会按预期执行,但是也会在同一超级视图中更新UIImage。

这会导致问题,因为UIImage可以平移并且无法将其重新居中。

我已经通过注释不同的部分对上面的代码进行了测试,发现是当它自己放置按钮时才引起这种行为。

当然,这不是我想要的行为。

任何帮助/想法/建议都将受到欢迎。

ViewController中子视图添加的顺序是...

  private func setupViews() {
    view.backgroundColor = .green

    view.addSubview(mapDisplay)
    view.addSubview(contextMenu)
    view.addSubview(FloatingMenu)

  }

1 个答案:

答案 0 :(得分:0)

我把代码拆开后自己解决了这个问题。

事实证明,我所讨论的UIImageView有一个空约束占位符,并且SnapKit接受了一个空约束作为显式指令来“删除”所有约束,并在其他调用时将所讨论的项重置为“零”。进行更新。

我认为这种行为是错误的,因为我的UIView是视图控制器中的同级子视图,但是确实存在……所以做类似的事情

mapDisplay.snp.makeConstraints {(c)in

}

当UIView更新按钮位置时,由于某种原因,会使UIImageView(mapDisplay)捕捉回到屏幕中心。

我猜应该将其发布在他们的gitHub上。