如何以编程方式将视图大小添加到其父视图?

时间:2016-09-26 06:05:13

标签: ios swift autolayout interface-builder uistackview

我正在开发一个自定义键盘,我在Interface Builder中编辑了自己的视图。

视图在加载时以编程方式添加到键盘根视图。它包含堆栈视图,并填充整个视图,自动调整大小。

问题是键盘视图的大小不适合它打开的应用程序的视图。看起来它有一些固定的大小,因为当我水平旋转模拟器时,我可以看到更多的宽度,而不是垂直时。

如何将其大小设置为放置在其中的根视图的宽度?

以下是键盘在界面生成器和运行iPhone 5S的模拟器中的外观:

sizes

2 个答案:

答案 0 :(得分:0)

首先,我们需要从布局更改中获取大小更改的挂钩,我们可以这样做:

override var bounds: CGRect {
    didSet {
      print("Bounds have changed: \(bounds)")
    }
}

这应该在您的自定义键盘视图中使用。接下来,我们要更新自定义键盘布局。查看截图,它表明我们需要做的就是调整键的高度和宽度,稍后您可以根据大小类更改添加调整,从而更好地控制布局。您将需要使用@IBOutlets保持对高度和宽度约束的引用,或者通过迭代子视图并手动查找和更改宽度和高度约束,两者都可能很乏味,但使用@IBOutlets是更容易。

func updateKeys() {
    DispatchQueue.main.async {
        // Create array of width constraints
        let widthConstraints: [NSLayoutConstraint] = widthArray() 
        widthConstraints.forEach { _ in /* change width constant for current layout */ }

        // Create array of height constraints
        let heightConstraints: [NSLayoutConstraint] = heightArray() 
        heightConstraints.forEach { _ in /* change height constant for current layout */ }

    }
}

这只是一种做法,我发现在自动布局中总是有一种方法可以使用复杂的布局,但它应该显示一个可以使用的模式。

答案 1 :(得分:-2)

您是否尝试过实施这些通知?

[[NSNotificationCenter defaultCenter] addObserver:self
                                       selector:@selector(keyboardFrameWillChange:)
                                           name:UIKeyboardWillShowNotification
                                         object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                       selector:@selector(keyboardFrameWillChange:)
                                           name:UIKeyboardWillChangeFrameNotification
                                         object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:)
                                           name:UIKeyboardWillHideNotification
                                         object:nil];

然后,当调用这些通知时,请将视图大小调整为键盘框

CGRect keyboardFrame;
[[notification.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];

CGRect viewFrame = keyboardFrame;