2016-04-20 2 views
2

У меня есть следующая иерархия представлений. Вид-> контейнер-> 2 UITextfields и 1 button в containerView. Контейнер находится в центре экрана. То, что я хочу сделать, это переместить контейнер вверх, когда клавиатура появится, а UITextfield находится за клавиатурой и вернуться в центр, когда клавиатура исчезнет. Вот скриншот для этого же.управлять просмотром с клавиатуры и автоспуск в центре

enter image description here

Какие ограничения мне нужно сделать, чтобы изменить или мне нужно добавить ограничения в коде?

+1

Использование https://github.com/hackiftekhar/IQKeyboardManager будет управлять ПОлОжЕНИЕ автоматически – kb920

+0

Я хочу сделайте это самостоятельно без третьей стороны. –

+0

@RahulVyas вы могли бы предоставить свое решение или принятый ответ? – Balasubramanian

ответ

2

Получите кадр контейнера во время показа клавиатуры и обновите новый размер кадра. «SetTranslatesAutoresizingMaskIntoConstraints» является правильным решением при обновлении кадр view.It работал для меня

enter image description here

@implementation ViewController 
{ 
CGRect defaultFrame; 
} 

- (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]; 
} 
#pragma mark Notifications 

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

[self.ContentView setTranslatesAutoresizingMaskIntoConstraints:YES]; 
[self.ContentView layoutIfNeeded]; 

CGRect contentInsets = CGRectMake(defaultFrame.origin.x, (keyboardSize.height), defaultFrame.size.width, defaultFrame.size.height); 
[UIView animateWithDuration:0.5f 
       animations:^{ 
        self.ContentView.frame = contentInsets; 

       } 
       completion:^(BOOL finished){ 

       } 
]; 

self.ContentView.frame = contentInsets; 

} 

- (void)keyboardWillHide:(NSNotification *)notification { 
[self.ContentView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[UIView animateWithDuration:0.5f 
       animations:^{ 
        self.ContentView.frame = defaultFrame; 
       } 
       completion:^(BOOL finished){ 

       } 
]; 

} 
0

Как я понимаю, вы пытаетесь переместить весь вид, когда UITextField становится первым ответчиком (т. Е. Добавляет клавиатуру в представление)? Если это так, то я хотел бы добавить код в методе делегата UITextField:

#define VIEW_TAG 12345 
#define kKeyboardOffsetY 80.0f 

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    // get a reference to the view you want to move when editing begins 
    // which can be done by setting the tag of the container view to VIEW_TAG 
    UIView *containerView = (UIView *)[self.view viewWithTag:VIEW_TAG]; 
    [UIView animateWithDuration:0.3 animations:^{ 
     containerView.frame = CGRectMake(0.0f, -kKeyboardOffsetY, containerView.frame.size.width, containerView.frame.size.height); 
    }]; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    UIView *containerView = (UIView *)[self.view viewWithTag:VIEW_TAG]; 
    [UIView animateWithDuration:0.3 animations:^{ 
     containerView.frame = CGRectMake(0.0f, self.view.frame.origin.y, containerView.frame.size.width, containerView.frame.size.height); 
    }]; 
} 
+0

У меня есть ограничения на контейнерный вид, чтобы держать его в центре. также у меня есть кнопки под видом контейнера. Не можем ли мы перевернуть весь просмотр? –

+0

увеличьте ось y (-kKeyboardOffsetY) здесь –

+0

, так как я использую раскадровку и автозагрузку containerView.frame не будет работать –

0

IBOutlet Возьмите ваше нижнее ограничение или верхнего ограничения зрения контейнера с помощью Ctrl + перетащить из respactive ограничения.

Если нижнее ограничение увеличит константу ограничения, равную высоте клавиатуры, когда клавиатура появляется и уменьшается при исчезновении клавиатуры.

Если используется верхнее ограничение, уменьшите константу, равную высоте клавиатуры, когда клавиатура появляется и увеличивается при исчезновении клавиатуры.

, например,

topConstraint.constant = topConstraint.constant + keyboardHeight; 

Update:

По вашему ограничения вы должны принять выходное отверстие вертикально центра или центра х и вы должны сделать что-то вроде,

self.verticallyCenter.constant = self.horizontalyCenter.constant - 100 //here 100 is keyboardheight for example and do it in viewdidload 

К этому ваш вид контейнера достигнет 100 пикселей.

При отставке клавиатуры вы можете добавить 100 к константе, чтобы получить исходное положение назад. Надеюсь, что это поможет :)

+0

У меня есть ограничения для центра, я должен удалить их? –

+0

Какие ограничения вы указали? скажите мне все ваши ограничения – Lion

+0

containserview.center.x = superview.center.x и containserview.center.y = superview.center.y –

0

UITextFieldDelegate добавить в файл .h и попробуйте следующий код это, несомненно, поможет вам

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    if (textField == username) 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardDidShowNotification object:nil]; 

    } 
    if (textField == password) 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardDidShowNotification object:nil]; 

    } 

    return YES; 
} 
- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 

} 
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    if (textField == username) 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardDidHideNotification object:nil]; 
    } 

    if (textField == password) 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardDidShowNotification object:nil]; 

    } 
    return YES; 
} 


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

    float newVerticalPosition = -keyboardSize.height + 100; 

    [self moveFrameToVerticalPosition:newVerticalPosition forDuration:0.3f]; 
} 


- (void)keyboardWillHide:(NSNotification *)notification 
{ 
    CGFloat kNavBarHeight = self.navigationController.navigationBar.frame.size.height; 
    [self moveFrameToVerticalPosition:kNavBarHeight forDuration:0.3f]; 
} 


- (void)moveFrameToVerticalPosition:(float)position forDuration:(float)duration 
{ 
    CGRect frame = self.view.frame; 
    frame.origin.y = position; 

    [UIView animateWithDuration:duration animations:^{ 
     self.view.frame = frame; 
    }]; 
} 
0

Похоже, вы дали правильные ограничения все, что вам нужно сделать сейчас, чтобы сделать выходное ограничение центра y и изменить его на клавиатуре, показать/скрыть события, которые вы можете захватить с помощью клавиатурыDidShow/keyboardWillShow и keyboardDidHide/keyboardWillHide уведомлений. что вы также можете добавить классные эффекты анимации для этих изменений. Попробуйте, дайте мне знать, если вам нужен пример.

Edit:

добавить ViewController в качестве наблюдателя за два уведомления:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardWasShown:) 
              name:UIKeyboardDidShowNotification 
              object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(keyboardDidHide:) 
              name:UIKeyboardDidHideNotification 
              object:nil]; 

Теперь предположим, что имя вашего ограничения является "constraintForTopSpace", а затем добавить два метода уведомлений:

- (void)keyboardWasShown:(NSNotification *)notification { 
    // Get the size of the keyboard. 
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    //Given size may not account for screen rotation 
    int height = MIN(keyboardSize.height,keyboardSize.width); 

    // Here you can set your constraint's constant to lift your container up. 
    [UIView animateWithDuration:0.5 animations:^{ 
     [constraintForTopSpace setConstant:constraintForTopSpace.constant - height]; 
     [self.view layoutIfNeeded]; 
    }]; 
} 

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

    int height = MIN(keyboardSize.height,keyboardSize.width); 

    // Here you can set your constraint's constant to move your container down. 
    [UIView animateWithDuration:0.5 animations:^{ 
     [constraintForTopSpace setConstant:constraintForTopSpace.constant + height]; 
     [self.view layoutIfNeeded]; 
    }]; 
} 

И вы также можете использовать UIKeyboardWillShowNotification/UIKeyboardWillHideNotification notificat иона, они будут активированы до того, как клавиатура появится на экране, что соответствует вашим требованиям.

Здесь добавление анимации придаст плавный внешний вид. ;)

+0

Да, пример будет замечательным. Настоящий пример рабочего кода в Obj-C. –

+0

@RahulVyas Я добавил фрагмент кода Objective C. посмотрите, работает ли это для вас. –

+0

что делать, если клавиатура имеет автокоррекцию? будет ли он автоматически рассчитываться в размере клавиатуры? –

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