【问题标题】:Making a custom UIView subview that fills its superview制作一个填充其父视图的自定义 UIView 子视图
【发布时间】:2015-06-28 02:51:20
【问题描述】:

所以我用自己的初始化器编写了自己的自定义视图。但是,当我的主视图加载时,我的自定义视图会以错误的方式描绘。它的边界为 600x600 矩形,而父视图为 375x607。我确实尝试过自动约束,似乎不起作用。我尝试在子视图初始化中以编程方式执行此操作,但每当我尝试将其 bounds 属性初始化为其父视图边界时,我在父视图中得到 nil。

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

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

func setup() {
    initPathLayer()
    initHandleView()
    initHandlePanGestureRecognizer()

    layoutPathLayer()
    layoutHandleViews()
}

我尝试了互联网上的所有内容以使子视图填充其父视图,但我认为子视图在父视图之前被初始化?那可能吗 ?在 ViewController 中,将我的自定义视图声明为 Outlet 连接。我确信问题应该是超级简单的,是我不知道 Swift 初始化视图的方式。

有什么想法吗?

谢谢。

【问题讨论】:

  • 尝试显示您添加的哪些约束应该有效。否则,您可以重写 layoutSubviews 方法以显式设置框架
  • 问题是子视图在初始化之前看不到它的父视图。我将制作约束的屏幕截图
  • 只看你的代码,你应该只在 layoutSubviews 中调用布局方法
  • 谢谢!就是这样。正如我所说,这是一个很小的问题,原因是我缺乏经验。
  • 哈哈不用担心,但你绝对应该能够在约束中表示这一点,所以我担心这不起作用

标签: ios swift layout


【解决方案1】:

首先,Views 的 init 方法并不是执行布局的最佳位置。视图可以在稍后调整大小,如果视图是从 Xib 加载的,或者您在 View Controllers viewDidLoad 函数中创建它,通常都是这种情况。

话虽如此,您有几种方法:

1。使用自动布局

界面生成器

这可以在 Interface Builder 中或以编程方式完成。在 Interface Builder 中,您只需使用“Pin”选项并选择视图的所有边

完成后,您应该能够在尺寸检查器中看到您的约束,如下所示:

以编程方式

或者,您始终可以在初始化程序中以编程方式添加约束:

override init(frame: CGRect) {
    let view = UIView(frame: .zero)
    view.translatesAutoresizingMaskIntoConstraints = false
    super.init(frame: frame)
    let viewsDict = ["view": view]
    addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[view]-0-|", options: .allZeros, metrics: nil, views: viewsDict))
    addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[view]-0-|", options: .allZeros, metrics: nil, views: viewsDict))
    addSubview(view)
}

convenience required init(coder aDecoder: NSCoder) {
    self.init(frame: .zero)
}

2。手动布局

调整蒙版大小

为此,您可以使用调整大小的蒙版,也可以在 layoutSubviews 中控制框架。调整掩码大小告诉系统视图应如何相对于父视图调整大小:

override init(frame: CGRect) {
    let view = UIView(frame: CGRectZero)
    view.translatesAutoresizingMaskIntoConstraints = false
    super.init(frame: frame)
    view.frame = bounds
    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    addSubview(view)
}

布局子视图

最后,您可以覆盖 layoutSubviews 并从那里开始:

override func layoutSubviews() {
    super.layoutSubviews()
    view.frame = bounds
}

【讨论】:

  • 希望我能投票更多!万一它对其他人有所帮助,我将一个子视图限制在其父视图中。在运行 iOS10 的设备上看起来不错。在使用 iOS 9 的设备中,子视图占据了覆盖父视图的整个屏幕。通过添加行 view.translatesAutoresizingMaskIntoConstraints = true 和 view.frame = bounds,我的问题得到了解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
相关资源
最近更新 更多