2013-10-16 13 views
6

問題は、ユーザーが検索バーに触れるとキーボードが正常に表示されることです。次に、presentQRメソッド(以下を参照)が呼び出された後で終了し、検索バーがタッチされると、スクリーンショットのようにキーボードが表示されます。これはiOS7です。それが重要かどうかは分かりません。UISearchbarがタッチされたときにオフセットキーボードを修正する方法

enter image description here

私は、次のコードを使用して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]; 

} 
+0

は、あなたがより多くのスクリーンショットをアップロードするだろうか? presentQRを行う前に – Mojtaba

答えて

4

第一はQRReaderViewControllerウィンドウまたはそのようにリフレーミングのようなものがないことを確認します。キーボードを正しく表示できないUIWindowと競合する要素がある可能性があります。 (例:不平衡な向きの変更)

第2ページあなたが何か見つからなかった場合は、次のコードを使用してキーボードビューにアクセスし、フレームをリセットしてみてください。あなたはkeyboardWillShowメソッドでこのコード(通知を登録する必要があります)

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html#//apple_ref/c/data/UIKeyboardWillShowNotification

PSを置くことができます。キーボードフレームを記録して、いつ変更されたかを知ることをお勧めします。

リフレーミングキーボード:ここで見つける:https://stackoverflow.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*/ 
    } 
} 
関連する問題