iPhone SDK: TextView, клавиатура в пейзажен режим

Как да се уверя, че текстовият изглед се показва и клавиатурата не закрива текстовия изглед, докато е в пейзажен режим.

Използвайки UICatalog, създадох TextViewController, който работи. В него има два метода за извикване на клавиатурата и проверка дали textView е позициониран над клавиатурата. просто работи страхотно в портретен режим.

Пейзажният режим ми работи, но на textView все още се поставя в горната част на iPhone, за да компенсира клавиатурата в портретен режим.

Промених методите за показване на клавиатурите.

По-долу е кодът за тези методи: (просто ще оставя да видя кода за показване, тъй като кодът за скриване ще бъде обратното..

- (void)keyboardWillShow:(NSNotification *)aNotification 
{
 UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
 if (orientation == UIInterfaceOrientationPortrait) {
   // the keyboard is showing so resize the table's height
  CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue];
  NSTimeInterval animationDuration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
  CGRect frame = self.view.frame;
  frame.size.height -= keyboardRect.size.height;
  [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
  [UIView setAnimationDuration:animationDuration];
  self.view.frame = frame;
  [UIView commitAnimations];
 } else if (orientation == UIInterfaceOrientationLandscapeLeft) {
  NSLog(@"Left"); // Verijderen later
  CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue];
  NSTimeInterval animationDuration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
  CGRect frame = self.view.frame;
  frame.size.width -= keyboardRect.size.height;
  [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
  [UIView setAnimationDuration:animationDuration];
  self.view.frame = frame;
  [UIView commitAnimations];
 } else if (orientation == UIInterfaceOrientationLandscapeRight){
  NSLog(@"Right"); // verwijderen later.
  CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue];
  NSTimeInterval animationDuration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
  CGRect frame = self.view.frame;
  frame.size.width -= keyboardRect.size.width;
  [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
  [UIView setAnimationDuration:animationDuration];
  self.view.frame = frame;
  [UIView commitAnimations];
 }

}

Знам, че трябва да променя реда frame.size.height -= keyboardRect.size.height, но изглежда не го карам да работи.

Опитах frame.size.width -= keyboardRect.size.height, което не проработи. Загубата на keyboardRect и рамката работят заедно, но, разбира се, клавиатурата закрива изгледа на текста........


person Arnold    schedule 14.05.2010    source източник


Отговори (3)


Открих, че горният код няма да работи, когато сте в пейзажен режим на iPad

Забележка: Премествам всички полета, тъй като в моя случай това ми трябваше :-)

- (void)keyboardWillShow:(NSNotification*)aNotification {
// Only do for Landscape Mode

    if (UIInterfaceOrientationIsLandscape([self interfaceOrientation])){
        NSDictionary *info = [aNotification userInfo];
        NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
        CGSize keyboardSize = [aValue CGRectValue].size;

        NSTimeInterval animationDuration = 0.300000011920929;
        CGRect frame = self.view.frame;
        frame.origin.x -= keyboardSize.height-44;
        frame.origin.y -= keyboardSize.height-44;
        frame.size.height += keyboardSize.height-44;
        [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
        [UIView setAnimationDuration:animationDuration];
        self.view.frame = frame;
        [UIView commitAnimations];

        viewMoved = YES;
    }
    keyboardInUse = YES;
}

- (void)keyboardWillHide:(NSNotification*)aNotification {
    if (UIInterfaceOrientationIsLandscape([self interfaceOrientation])){
        if (viewMoved) {

            NSDictionary *info = [aNotification userInfo];
            NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
            CGSize keyboardSize = [aValue CGRectValue].size;

            NSTimeInterval animationDuration = 0.300000011920929;
            CGRect frame = self.view.frame;
            frame.origin.y += keyboardSize.height-44;
            frame.origin.x += keyboardSize.height-44;
            frame.size.height -= keyboardSize.height-44;
            [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
            [UIView setAnimationDuration:animationDuration];
            self.view.frame = frame;
            [UIView commitAnimations];

            viewMoved = NO;
        }
    }
    keyboardInUse = NO;
}
person Don    schedule 25.05.2011

Ако смятате, че имате нужда от различен код за различните ориентации, правите нещо друго грешно. След като ориентацията се промени и вашият суперизглед отговори, стойността, която трябва да се промени, трябва винаги да бъде височината на рамката.

person matt    schedule 13.06.2010
comment
Ако това е вярно, защо този код: CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue]; NSTimeInterval animationDuration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; CGRect рамка = self.view.frame; frame.size.height -= keyboardRect.size.height; [UIView beginAnimations:@ResizeForKeyboard context:nil]; [UIView setAnimationDuration:animationDuration]; self.view.frame = рамка; [UIView commitAnimations]; доведе до изглед, който се движи надясно, докато сте в пейзажен режим? - person Arnold; 14.06.2010

Ето код, който използвам за тази цел. Работи както на iPad, така и на iPhone в пейзажен и портретен режим (вдъхновен от код от документацията на Apple):

// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications
{
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillBeHidden:)
                                             name:UIKeyboardWillHideNotification object:nil];

}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

float offset;
if UIInterfaceOrientationIsPortrait(self.interfaceOrientation)
    offset = kbSize.height;
else
    offset = kbSize.width;

[UIView animateWithDuration:0.5
                 animations:^{
                     CGRect frameTxtField = myTextField.frame;
                     frameTxtField.origin.y -= offset;
                     myTextField.frame = frameTxtField;
                 }
 ];  

}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

float offset;
if UIInterfaceOrientationIsPortrait(self.interfaceOrientation)
    offset = kbSize.height;
else
    offset = kbSize.width;

[UIView animateWithDuration:0.5
                 animations:^{
                     CGRect frameTxtField = myTextField.frame;
                     frameTxtField.origin.y += offset;
                     myTextField.frame = frameTxtField;
                 }
 ];  
}

Не забравяйте да извикате метода registerForKeyboardNotifications (напр. във viewDidLoad).

person RawMean    schedule 15.12.2011