触摸 UISearchbar 时如何修复偏移键盘
Posted
技术标签:
【中文标题】触摸 UISearchbar 时如何修复偏移键盘【英文标题】:How to fix offset keyboard when UISearchbar is touched 【发布时间】:2013-10-16 13:20:44 【问题描述】:我遇到的问题是,当用户触摸搜索栏时,键盘看起来很好。然后,当presentQR
方法(见下文)被调用然后解除,然后触摸搜索栏时,键盘出现如屏幕截图所示的偏移位置。这是ios7;不知道这是否重要。
我正在使用以下代码添加 UISearchbar:
// search bar
UIView *searchBarView = [[UIView alloc] initWithFrame:CGRectMake(90.0, 0.0, 200.0, 44.0)];
searchBarView.autoresizingMask = 0;
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 190, 40)];
searchBar.backgroundImage = [[UIImage alloc] init];
searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
self.navigationItem.titleView = searchBar;
searchBar.delegate = self;
[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],UITextAttributeTextColor,[UIColor whiteColor],UITextAttributeTextShadowColor,[NSValue valueWithUIOffset:UIOffsetMake(0, -1)],UITextAttributeTextShadowOffset, nil] forState:UIControlStateNormal];
UITextField *textfield = [[UITextField alloc] init];
searchBar.placeholder = @"City Search";
// hide magnifying glass
textfield = nil;
for (UIView* subView in searchBar.subviews)
if ([subView isKindOfClass:[UITextField class]])
textfield = (UITextField*)subView;
[(UITextField*)subView setTextColor:[UIColor whiteColor]];
[(UITextField*)subView setFont:[UIFont fontWithName:@"DIN-Regular" size:18]];
textfield.leftViewMode = UITextFieldViewModeNever;
textfield.rightViewMode = UITextFieldViewModeAlways;
break;
UIButton *cancelButton;
for (id button in searchBar.subviews)
if ([button isKindOfClass:[UIButton class]])
cancelButton=(UIButton*)button;
break;
[searchBar addSubview:textfield];
[searchBarView addSubview:searchBar];
self.navigationItem.titleView = searchBarView;
-(void)presentQR
QRReaderViewController *qr = [[QRReaderViewController alloc]initWithNibName:@"QRReaderViewController" bundle:nil];
UIButton *removeQRBtn=[UIButton buttonWithType:UIButtonTypeCustom];
removeQRBtn.frame=CGRectMake(260, 10, 60, 40);
[removeQRBtn addTarget:self action:@selector(removeQR) forControlEvents:UIControlEventTouchDown];
[removeQRBtn setImage:[UIImage imageNamed:@"qrcode.png"] forState:0];
[qr.view addSubview:removeQRBtn];
qr.view.backgroundColor = customColorGrey;
qr.modalPresentationStyle = UIModalTransitionStyleCrossDissolve;
// [self presentModalViewController:qr animated:YES];
[self presentViewController:qr animated:YES completion:nil];
-(void)removeQR
// [self dismissModalViewControllerAnimated:YES];
[self dismissViewControllerAnimated:YES completion:nil];
【问题讨论】:
你能上传更多截图吗?在做presentQR之前 【参考方案1】:1st 确保在 QRReaderViewController 中没有类似重构窗口之类的东西。可能存在与 UIWindow 冲突的元素,导致键盘无法正确显示。 (例如不平衡的方向变化。)
2nd 如果您在那里没有找到任何东西,您可以尝试使用以下代码访问键盘视图并尝试重置框架。您可以将此代码放在keyboardWillShow方法中(需要注册通知)
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html#//apple_ref/c/data/UIKeyboardWillShowNotification
PS。我建议只记录键盘框架,以便您知道它何时更改。
重构键盘:在这里找到:https://***.com/a/10957843/1017340
//The UIWindow that contains the keyboard view - It some situations it will be better to actually
//You need to iterate through each window to figure out where the keyboard is, but In my applications case
//I know that the second window has the keyboard so I just reference it directly
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
//Because we cant get access to the UIPeripheral throughout the SDK we will just use UIView.
//UIPeripheral is a subclass of UIView anyways
UIView* keyboard;
//Iterate though each view inside of the selected Window
for(int i = 0; i < [tempWindow.subviews count]; i++)
//Get a reference of the current view
keyboard = [tempWindow.subviews objectAtIndex:i];
//Assuming this is for 4.0+, In 3.0 you would use "<UIKeyboard"
if([[keyboard description] hasPrefix:@"<UIPeripheral"] == YES)
NSLog(@"Keyboard Frame: %@",NSStringFromCGRect(keyboard.frame));
//HERE : try reframing the keyboard
//[keyboard setFrame:CGRectMake(...)]; /*NOT TESTED NOT RECOMMENDED*/
【讨论】:
以上是关于触摸 UISearchbar 时如何修复偏移键盘的主要内容,如果未能解决你的问题,请参考以下文章