iOS 8自定义键盘self.view.frame返回0

时间:2014-09-25 02:06:15

标签: ios iphone swift ios8 ios8-extension

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

为什么self.view的框架在viewDidLoad中返回0?它的尺寸不应该已经在这里设定了吗?这个(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不等。似乎没什么区别。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

我可以通过在顶部添加textField并使其成为FirstResponder来实现它:

导入UIKit

类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)

}

}

答案 2 :(得分:0)

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

我建议使用自动布局(类似于&#34; nextKeyboardButton&#34;在键盘扩展示例代码中完成),在这种情况下,大多数情况下您不必担心处理帧更改。例如。在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的初始化self.contentMode = UIViewContentModeRedraw;中设置contentMode,否则不会在帧更改时调用drawRect。