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

Posted

技术标签:

【中文标题】如何以编程方式为其父视图添加视图大小?【英文标题】:How to make a programmatically added view size to its parent view? 【发布时间】:2016-09-26 06:05:12 【问题描述】:

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

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

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

如何使它的大小与它所在的根视图的宽度一致?

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

【问题讨论】:

请添加一些截图来展示它现在的样子。 【参考方案1】:

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

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

    

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

【讨论】:

【参考方案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;

【讨论】:

这个问题被标记为 Swift,而不是 Objective-C。

以上是关于如何以编程方式为其父视图添加视图大小?的主要内容,如果未能解决你的问题,请参考以下文章

尝试以编程方式使用嵌套的 Stack 视图制作网格

如何以编程方式设置子视图的框架以使其适合其父视图?

如何以编程方式调整自定义视图的大小?

Swift:以编程方式添加视图时,UIScrollView 的可滚动内容大小不明确,而不使用 IB

如何以编程方式更改视图大小?

如果我的子视图的大小与其父视图相同,如何使用 ctrl-drag 在 IB 中设置约束?