繁体   English   中英

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

[英]How to make a programmatically added view size to its parent view?

我正在使用具有自己的视图的自定义键盘,该视图在Interface Builder中进行编辑。

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

问题是键盘视图的大小与打开的应用程序的视图不同。似乎它具有固定的大小,因为当我水平旋转模拟器时,可以看到更多的宽度,而在垂直时看不到。

如何使其尺寸与放置的根视图的宽度相同?

这是键盘在Interface Builder和运行iPhone 5S的模拟器中的外观:

尺寸

首先,我们需要从布局更改中了解大小更改,我们可以这样进行:

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 */ }

    }
}

这只是一种方法,我发现对于自动布局,在复杂的布局中总会有一种方法,但是它应该向您展示可以使用的模式。

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

[[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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM