Search code examples
iosios5ios6

UITextField in UIAlertView: clear button is not centered vertically in iOS 6.1


I use the following code to show a UIAlertView with a text field:

UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:title message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Rename", nil];
alertView.alertViewStyle = UIAlertViewStylePlainTextInput;

UITextField* textField = [alertView textFieldAtIndex:0];
textField.clearButtonMode = UITextFieldViewModeWhileEditing;

[alertView show];

The result looks like this on iOS 5.1:

enter image description here

and on iOS 6.1:

enter image description here

As you can see, the clear button is a bit higher than it should be on iOS 6.1. Any idea how to properly center the button? Adding textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; does not help either.

(Apparently, this is a bug in iOS 6.1 but maybe someone knows a workaround. Besides, the height of the text field in alert views also seem to differ in different OS versions but that is another issue.)


Solution

  • This looks like a bug from Apple, but you can always add your own clear button in the textField, doing something like this :

    First create a UITextField property:

    @property (nonatomic, strong) UITextField *textField;
    

    And then assign it to the alertView's textField

    UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:title message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Rename", nil];
    alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
    
    self.textField = [alertView textFieldAtIndex:0];
    self.textField.delegate = self;
    
    //Create a custom clear button
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 19, 19)];
    [button setImage:[UIImage imageNamed:@"clearButton.png"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(clearText) forControlEvents:UIControlEventAllTouchEvents];
    
    [self.textField setRightView:button];
    self.textField.rightViewMode = UITextFieldViewModeAlways;
    

    And then in the clearText method,

    - (void)clearText {
        [self.textField setText:@""];
    }  
    

    I tried this out and it works

    Hope this helps