2013-11-01 31 views
11

Kullanıcı oturum açma formunu göstermek için storyboard'umda bir görünüm var, bu şekilde şöyle görünür: main view-> scroll view-> content view-> iki metin alanı ve oturum açma düğmesi Görünümün altındaki üst ve bir kayıt düğmesi. Otomatik kullan özelliğini kullanıyorum ve alt düğme alt alan kısıtlaması içeriyor. Metin alanına ve klavyeye dokunduğumda, görünür rect boyutlarını değiştirmek için görünümü kaydırmak istiyorum, ancak içerik boyutu kayıt düğmesine gitmek için kalmalıdır, ancak kaydırma görünümünün boyutu değiştiğinde düğme yukarı hareket etmelidir. İstediğimi nasıl yapabilirim? Klavye göründüğündescrollview ve klavyeli iOS AutoLayout

Bu kodu kullanın:

- (void)keyboardWillShow:(NSNotification *)aNotification 
{ 
    NSDictionary *info = [aNotification userInfo]; 
    NSValue *kbFrame = [info objectForKey:UIKeyboardFrameEndUserInfoKey]; 
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    CGRect keyboardFrame = [kbFrame CGRectValue]; 

    CGSize s = self.scrollView.contentSize; 
    CGFloat height = keyboardFrame.size.height; 
    self.scrollViewBottomLayoutConstraint.constant = height; 

    [UIView animateWithDuration:animationDuration animations:^{ 
     [self.view layoutIfNeeded]; 
     [self.scrollView setContentSize:s]; 
    }]; 
} 

cevap

29

yalnız içerik boyutunu bırakarak deneyin ve bunun yerine kaydırma görünümün contentInset özelliğini ayarlayın. O zaman kısıtlamalarla uğraşmak zorunda değilsiniz.

- (void)keyboardUp:(NSNotification *)notification 
{ 
    NSDictionary *info = [notification userInfo]; 
    CGRect keyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    keyboardRect = [self.view convertRect:keyboardRect fromView:nil]; 

    UIEdgeInsets contentInset = self.scrollView.contentInset; 
    contentInset.bottom = keyboardRect.size.height; 
    self.scrollView.contentInset = contentInset; 
} 
+0

Teşekkür ederiz. İşe yarıyor. –

+0

Harika cevap; benim için harika çalışıyor! Teşekkürler! –

+1

güzel ve basit, ancak bir sorun kaydırma görünümü çubuklarının kaydırma/tablo/koleksiyon görünümünün görünür kısmına yeniden boyutlandırmamasıdır. –

1

bulduğum en iyi yolu şöyle NSLayoutConstraint geçersiz kılmak için geçerli:

@implementation NHKeyboardLayoutConstraint 

- (void) dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void) awakeFromNib { 
    [super awakeFromNib]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillChangeFrame:) 
               name:UIKeyboardWillChangeFrameNotification 
               object:nil]; 
} 

- (void)keyboardWillChangeFrame:(NSNotification *)notification { 

    CGRect endKBRect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 

    CGFloat animationDuration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]; 
    CGRect frame = [UIApplication sharedApplication].keyWindow.bounds; 

    self.constant = frame.size.height - endKBRect.origin.y; 


    [UIView animateWithDuration:animationDuration animations:^{ 
     [[UIApplication sharedApplication].keyWindow layoutIfNeeded]; 
    }]; 
} 


@end 

ardından xib bu sınıfa kusurlu kısıtı sınıf türünü değiştirmek.

İlgili konular