2015-05-27 5 views
4

У меня есть UIView, который я хотел бы переместить вверх/вниз, появляется или исчезает UIKeyboard. К сожалению, я не могу заставить его работать. До AutoLayout это было без проблем, но с AutoLayout У меня есть некоторые проблемы с этим.Перемещение UIView при появлении клавиатуры с AutoLayout

Вот то, что я до сих пор:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillHide:) 
               name:UIKeyboardWillHideNotification object:nil]; 
    self.keyboardIsShown = NO; 

} 

-(void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillShowNotification 
                object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillHideNotification 
                object:nil]; 
} 


-(void)keyboardWillShow:(NSNotification*)notification{ 
    if (self.keyboardIsShown) { 
     return; 
    } 

    //change y Position of self.loginView 

    self.keyboardIsShown = YES; 
} 

-(void)keyboardWillHide:(NSNotification*)notification{ 
    //Change y Position of self.loginView 
    self.keyboardIsShown = NO; 
} 

Конечно методы дозвонились, но мне нужно некоторое руководство о том, как изменить у-позиции моего UIView. Простое изменение положения y кадра не работает вообще.

Здесь вы можете найти мою настройку интерфейса с ограничениями, которые я добавил в UIView. Interface Setup

Таким образом, все компоненты для UIImageView кроме содержатся в loginView Outlet .Это мнение я хотел бы, чтобы двигаться вверх или вниз в зависимости от клавиатуры отображается или нет.

Что делает это для меня трудным, так это то, что, как вы могли видеть, UIImageView имеет фиксированную высоту, ширину и центр по вертикали.

+0

dont forget '- (void) viewWillLayoutSubviews' – 0yeoj

+0

С автоматической компоновкой вы не настраиваете рамки просмотра. Вместо этого отрегулируйте ограничения, которые вызывают рамки представления (в этом случае, возможно, верхнее пространство для константы супервизора будет уменьшаться). Или разместите представления в режиме прокрутки и прокрутите их. – danh

+0

Да, я пойду с этим решением. Похоже, это самая простая вещь. На данный момент обновление ограничений не работает для меня. – dehlen

ответ

4

Я только что сделал это. В основном, оберните все, что вам нужно, чтобы переместить в виде контейнера, а затем анимируйте верхнюю константу ограничения в сотрудничестве с уведомлениями show/hide на клавиатуре.

UIKeyboardWillShowNotification 
UIKeyboardDidHideNotification 

В уведомлении является USERINFO, который расскажет вам о высоте клавиатуры, а также позволит вам получить ваши анимации в синхронизации с клавиатурой для плавного перехода.

+0

Посмотрите на мой вопрос, я использую UINotifications. Как я могу изменить ограничение программно? Я определил ограничения в своем раскадровке. – dehlen

+3

@unverschaemt Вы можете создать выход к ограничению, а затем изменить его константу с помощью этого –

+0

. Хорошо, я попробую это. – dehlen

-1

Перемещение UIView когда появляется клавиатура (без Scrollview)


Я также имел весьма схожую конструкцию приложения недавно & ничего не работал для меня, кроме этого. У меня было no scrollview только вид & все компоненты были внутри него.

- (void)viewWillAppear:(BOOL)animated { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 
} 


- (void)viewWillDisappear:(BOOL)animated { 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 
} 



- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    [UIView animateWithDuration:0.3 animations:^{ 
     CGRect f = self.view.frame; 
     f.origin.y = -keyboardSize.height; 
     self.view.frame = f; 
    }]; 
} 

-(void)keyboardWillHide:(NSNotification *)notification 
{ 
    [UIView animateWithDuration:0.3 animations:^{ 
     CGRect f = self.view.frame; 
     f.origin.y = 0.0f; 
     self.view.frame = f; 
    }]; 
} 
+0

вопрос был об автозапуске - гораздо проще с свойством frame –

0

Что я сделал до сих пор, так это получение оригинальной рамки представления, которую мы хотим перемещать вверх и вниз. Убедитесь, что вы получите его в ViewDidAppear не ViewDidLoad

-(void)viewDidAppear:(BOOL)animated 
{ 
    _loginHolderOriginalFrame = self.loginHolderView.frame; 
} 

Следующая функция будет для отображения/скрытия клавиатуры

-(void) _keyboardWillShow:(NSNotification *)note 
{ 
    [self.view layoutIfNeeded]; 
    [UIView animateWithDuration:0.25 animations:^{ 
     self.logoImageView.alpha = 0; 
     CGRect rect = _loginHolderOriginalFrame; // bounds 
     rect.origin.y = 15; 

     [self.loginHolderView setFrame:rect]; 
    }]; 
} 

-(void) _keyboardWillHide:(NSNotification *)note 
{ 
    [self.view layoutIfNeeded]; 
    [UIView animateWithDuration:0.5f animations:^{ 
     self.logoImageView.hidden = NO; 
    }]; 

    [self restoreLoginFrame]; 
} 

-(void)restoreLoginFrame 
{ 
    [UIView animateWithDuration:0.25 animations:^{ 
     self.logoImageView.alpha = 1; 
     [self.loginHolderView setFrame:_loginHolderOriginalFrame]; 
    }]; 
} 

Когда мы показываем клавиатуру, мы двигаемся вверх вид на позицию у для ЭГ равным 15. и в случае, если клавиатура скрыта, мы перемещаем представление назад в исходное положение.

Надеюсь, что это поможет.

Смежные вопросы