Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fix offset keyboard when UISearchbar is touched

The problem I'm having is that when a user touches into the search bar the keyboard appears fine. Then when the presentQR method (see below) is called and then dismissed and then the searchbar is touched the keyboard appears as shown in the screenshot where it is offset. This is iOS7; not sure if that matters though.

enter image description here

I'm adding a UISearchbar using the following code:

    // 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];

}
like image 524
hanumanDev Avatar asked Oct 16 '13 13:10

hanumanDev


1 Answers

1st Make sure that in QRReaderViewController there is nothing like reframing window or such. There might be an element conflicting with UIWindow preventing keyboard to be shown correctly. (e.g unbalanced orientation changes.)

2nd If you didn't find anything there you could try accessing the keyboard view using the following code and attempt to reset the frame. You could put this code in keyboardWillShow method (need to register for the notification)

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

PS. I would suggest to just log the keyboard frame so you know when it's changed.

Reframing Keyboard: Found here: 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*/
    }
}
like image 70
Mojtaba Avatar answered Oct 22 '22 20:10

Mojtaba