2014-09-23 68 views
1

我有一個固定在我的主UIViewController的視圖(self.view)底部的文本字段,當用戶點擊它時,這個函數被調用(通過UIKeyboardWillShowNotification),這將改變高度 - 它只是出現在iOS動畫主UIViewController的視圖高度

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

    CGFloat textFieldHeight = activeField.frame.size.height; 
    CGPoint textFieldOrigin = activeField.frame.origin; 
    textFieldOrigin.y += textFieldHeight; 

    CGRect visibleRect = self.view.frame; 
    visibleRect.size.height -= keyboardSize.height; 

    if (!CGRectContainsPoint(visibleRect, textFieldOrigin)) { 
     CGRect r = self.view.frame; 
     r.size.height -= keyboardSize.height; 

     [UIView animateWithDuration:1.0 
        animations:^{ 
         self.view.frame = r; 
        }]; 
    } 
} 

它會調整的self.view.frame很好,所以它是所有被調用和運行,但由於某些原因拒絕了第二動畫吧:self.view.frame的立即放置。

我需要做什麼才能讓這種高度變化動畫?

+0

您使用的自動佈局? – 2014-09-23 13:53:37

+0

我這麼認爲。如果這就是你的意思,我將textfield固定在UIViewController視圖的底部,左側和右側? – 2014-09-23 14:18:08

回答

1

如果您有自動佈局,則不應直接更改框架,而應更改約束條件。 添加一個IBOutlet的約束(底部約束),並改變常數像這樣:

myTextFieldConstrain.constant -= YOUR_VALUE 

另外,如果你想讓它動畫,來電[YOURSUPERVIEW layoutIfNeeded];你改變常數後。

例子:

[UIView animateWithDuration:1.0 
        animations:^{ 
         myTextFieldConstrain.constant -= YOUR_VALUE; 
         [YOURSUPERVIEW layoutIfNeeded]; 
        }]; 
1

嘗試稍微延遲調度它,如:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
    [UIView animateWithDuration:1.0 
        animations:^{ 
         self.view.frame = r; 
        }]; 
} 

這通常使的伎倆。

+0

感謝您的回覆。我試過這個,它在1秒後出現,即仍然沒有動畫。我已將動畫持續時間延長至10秒,並立即調整大小。 – 2014-09-23 13:50:51