我正在为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不等。似乎没什么区别。
答案 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中的帧大小不正确。请参阅here和here,其中还提供了有关如何处理布局的一些建议。
我建议使用自动布局(类似于&#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。