2

我正在为 iOS 8 编写自定义键盘。我的主 UIView{{0, 0}, {0, 0}}在我的viewDidLoad方法中返回。我尝试使用 view.frame 和 bounds 接收 CGRect,但都返回 0。但是,如果我使用这些相同的方法在它们返回的方法中检索我的视图坐标,viewDidAppear它们返回正常:{{0, 0}, {320, 216}}。这里的问题是 viewDidAppear 在 didLoad 之后运行,所以我无法从 didAppear 中检索大小并在 didLoad 中使用它。这是我的问题:

为什么 self.view 的框架在中返回 0 viewDidLoad?它的大小不应该在这里设置吗?这 (viewDidLoad) 是我应该进行大部分启动和 UI 设置的地方,对吗?我在 Xcode 方面有中等经验。

我正在快速编程,虽然这不重要(?)我认为值得注意。Obj-C 中的答案很好。

编辑:我使用以下类创建了一个全新的 Xcode 项目和目标,并收到相同的错误:

import UIKit

class KeyboardViewController: UIInputViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    println(self.view.frame) // returns (0.0,0.0,0.0,0.0)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

override func viewDidAppear(animated: Bool) {
    println(self.view.frame) // returns (0.0,0.0,320.0,216.0)
}


}

我已经用模拟器和物理设备进行了测试,范围从 6 到 4S。似乎没有什么不同。

4

3 回答 3

1

viewDidLoad 中的帧大小不正确是视图显示层次结构(不仅是键盘扩展)的一般属性。请参阅此处此处,其中还提供了有关如何处理布局的一些建议。

我建议使用自动布局(类似于在键盘扩展示例代码中完成“nextKeyboardButton”的方式),在这种情况下,大多数情况下您不必担心处理帧更改。例如在 viewDidLoad

    MyKeyboardView* keyboardView = [[keyboardView alloc] init];
    keyboardView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.inputView addSubview: keyboardView];

    NSLayoutConstraint *leftSideConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0];
    NSLayoutConstraint *rightSideConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0];
    NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];
    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0];

    [self.inputView addConstraints:@[leftSideConstraint, rightSideConstraint, bottomConstraint, topConstraint]];

这样,keyboardView 的框架将跟踪 inputView 框架(设置为方向和设备的默认键盘框架大小),因此会随着方向的变化自动调整大小。然后,您可以在 MyKeyboardView 类的 layoutSubviews 中处理进一步的自定义布局。最后一件事,如果您的 MyKeyboardView 在 drawRect 中进行任何自定义绘图,您将需要在 MyKeyboardView 的 init 中设置 contentMode,self.contentMode = UIViewContentModeRedraw;否则不会在帧更改时调用 drawRect。

于 2014-10-21T17:48:47.537 回答
1

您应该检查self.inputView.frame而不是self.view.frame自定义键盘

如果其横向模式或纵向模式,您可以使用 isPortraitLayout 方法检查/初始化视图...

-(BOOL) isPortraitLayout{
    int appExtensionWidth = (int)round(self.view.frame.size.width);

    int possibleScreenWidthValue1 = (int)round([[UIScreen mainScreen] bounds].size.width);
    int possibleScreenWidthValue2 = (int)round([[UIScreen mainScreen] bounds].size.height);

    int screenWidthValue;

    if (possibleScreenWidthValue1 < possibleScreenWidthValue2) {
        screenWidthValue = possibleScreenWidthValue1;
    } else {
        screenWidthValue = possibleScreenWidthValue2;
    }

    return (appExtensionWidth == screenWidthValue);
}
于 2014-09-27T13:02:42.130 回答
0

我可以通过在顶部添加一个 textField 并使其成为 FirstResponder 来使其工作:

import UIKit

class KeyboardViewController: UIInputViewController {
    
    @IBOutlet var textField: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        textField.becomeFirstResponder()
        println(self.view.frame) // returns (0.0,0.0,375.0,667.0)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
    }
    
    override func viewDidAppear(animated: Bool) {
        println(self.view.frame) // returns (0.0,0.0,375.0,667.0)

    }
}
于 2014-09-25T04:09:27.490 回答