Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Right aligned UITextField spacebar does not advance cursor in iOS 7

In my iPad app, I noticed different behavior between iOS 6 and iOS 7 with UITextFields.

I create the UITextField as follows:

UIButton *theButton = (UIButton*)sender; UITextField *textField = [[UITextField alloc] initWithFrame:[theButton frame]];  [textField setDelegate:self]; [textField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter]; [textField setContentHorizontalAlignment:UIControlContentHorizontalAlignmentRight];  textField.textAlignment = UITextAlignmentRight; textField.keyboardType = UIKeyboardTypeDefault;  ...  [textField becomeFirstResponder]; 

In iOS 6, when I type "hello world" the cursor advances a blank space when I hit the spacebar after "hello."

In iOS 7, the cursor does not advance when I hit the spacebar. However, when I type the "w" in "world," it shows the space and the w.

How can I advance the cursor when the spacebar is hit in iOS 7?

Update:

If I change the textField.textAlignment to UITextAlignmentLeft, then the space appears in iOS 7. I would like to keep it right aligned, if possible.

like image 659
jkh Avatar asked Oct 24 '13 15:10

jkh


1 Answers

It would be a bit of a hack, but if you really need that to look the iOS6 way, you can replace space with non-breaking space as it's written. It's treated differently. Example code could look like this:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {     // only when adding on the end of textfield && it's a space     if (range.location == textField.text.length && [string isEqualToString:@" "]) {         // ignore replacement string and add your own         textField.text = [textField.text stringByAppendingString:@"\u00a0"];         return NO;     }     // for all other cases, proceed with replacement     return YES; } 

In case it's not clear, textField:shouldChangeCharactersInRange:replacementString: is a UITextFieldDelegate protocol method, so in your example, the above method would be in the viewcontroller designated by [textField setDelegate:self].

If you want your regular spaces back, you will obviously also need to remember to convert the text back by replacing occurrences of @"\u00a0" with @" " when getting the string out of the textfield.

like image 84
triazotan Avatar answered Oct 03 '22 03:10

triazotan