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

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

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

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

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

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

【问题讨论】:

  • 请添加一些截图来展示它现在的样子。

标签: ios swift autolayout interface-builder uistackview


【解决方案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。
    猜你喜欢
    • 2023-03-05
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多