- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以我一直在研究这个自定义键盘,在 iOS 8 Beta 3 之前一切都很好。
我为 iPhone Portrait、iPhone Landscape、iPad Portrair、iPad Landscape 和 iPhone 4 Portrait 创建了 5 个 xib,问题就在这里。
在我的 KeyboardViewController:UIInputViewController 中,它是在我基于模板创建自定义键盘时创建的。
我有这个私有(private)方法来确定我应该加载哪个 xib,基本上我只是检查屏幕宽度,然后删除所有 subview 并添加新的键盘 View 。
- (void)viewWillLayoutSubviews
{
NSLog(@"[DEBUG] viewWillLayoutSubviews");
[super viewWillLayoutSubviews];
[self determineKeyboardNib:self.view.frame.size];
}
//
//- (void)viewDidLayoutSubviews
//{
// NSLog(@"[DEBUG] viewDidLayoutSubviews");
// [super viewDidLayoutSubviews];
// [self determineKeyboardNib:self.view.frame.size];
//}
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
NSLog(@"[DEBUG] viewWillTransitionToSize:withTransitionCoordinator:");
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[self determineKeyboardNib:size];
}
/*
* Determine which xib file to load based on the width of the screen
*/
- (void) determineKeyboardNib: (CGSize)size
{
NSLog(@"[DEBUG] determineKeyboardNib: Enter if");
KeyboardIBBackend *keyboard_view;
// determine device
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPad");
// iPad
if (size.width > 1000) {
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPad Landscape");
// landscape
keyboard_view = [KeyboardIBBackend keyboardiPadLandscapeView];
}else{
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPad Portrait");
// portrait
keyboard_view = [KeyboardIBBackend keyboardiPadPortraitView];
}
}else{
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPhone");
// iPhone
if (size.width > 500){
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPhone Landscape");
// landscape
keyboard_view = [KeyboardIBBackend keyboardiPhone5LandscapeView];
}else if(size.width > 450){
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPhone 4 Portrait");
// portrait
keyboard_view = [KeyboardIBBackend keyboardiPhone4LandscapeView];
}else{
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPhone 5 Portrait");
keyboard_view = [KeyboardIBBackend keyboardiPhonePortraitView];
}
}
NSLog(@"[DEBUG] determineKeyboardNib: Exit if");
keyboard_view.parentview = self;
// remove previous keyboard view
for (UIView *v in [self.view subviews]) {
[v removeFromSuperview];
}
// add the newly determined view
NSLog(@"[DEBUG] determineKeyboardNib: before addSubview");
[self.view addSubview:keyboard_view];
NSLog(@"[DEBUG] determineKeyboardNib: after addSubview");
}
首先,我尝试将此方法放入 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator 但无论是 Beta 2 还是 Beta 3 都没有被调用。
因此,我将该方法放在 viewWillLayoutSubviews: 中,在 Beta 3 之前,它的效果非常好。
在 Beta 3 中,当我旋转设备时,将无限期调用 viewWillLayoutSubviews。我想那是因为在 detemineKeyboardNib 方法中,最后一行是
[self.view addSubview:keyboard_view]
这可能导致它一次又一次地调用 viewWillLayoutSubviews。但是,在 Beta 2 中情况并非如此。
然后我尝试在 viewDidLayoutSubviews 中 pur determineKeyboardNib,同上。
所以我想知道在 Beta 3 中处理设备旋转的正确方法是什么。我相信 viewWillTransitionToSize:withTransitionCoordinator: 应该是正确的方法但是当我旋转设备时它真的没有被调用...请帮助在这里。
谢谢,
最佳答案
我不知道你是否已经修复,但我发现一个似乎可行的解决方案是将代码放在一个 if block 中,该 block 仅在大小发生变化时运行,然后调用 super viewWillLayoutSubviews。
像这样:
-(void)viewWillLayoutSubviews
{
if(self.size.frame.width != self.someClassVariableToTrackWidth)
{
self.someClassVariableToTrackWidth = self.size.frame.width;
//call stuff here
}
[super viewWillLayoutSubviews];
}
我正在寻找更好的解决方案,因为这一直是一种骇人听闻的方法,当我找到它时,我会发布它。
关于ios - 如何在 Beta 3 中设备旋转时正确处理自定义键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24719379/
我是一名优秀的程序员,十分优秀!