self.accountViewController.modalPresentationStyle = UIModalPresentationFormSheet;
を使用してUIViewController
を表示しましたが、iOS 8では、最後のUITextView
が押し上げられるときにキーボードから非表示になります。それを回避する方法は?
@Olegのソリューションは優れていますが、キーボードのサイズの変更は考慮されていませんが、すでに表示されています。また、アニメーションの長さと他のいくつかのパラメーターをハードコーディングしました。以下の私の解決策を参照してください:
UIKeyboardWillChangeFrameNotification
のオブザーバーをviewDidLoad
に追加します
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];
次に、メソッドを追加します。
- (void)keyboardFrameWillChange:(NSNotification *)notification
{
CGRect keyboardEndFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect keyboardBeginFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
UIViewAnimationCurve animationCurve = [[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
NSTimeInterval animationDuration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] integerValue];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:animationDuration];
[UIView setAnimationCurve:animationCurve];
CGRect newFrame = self.view.frame;
CGRect keyboardFrameEnd = [self.view convertRect:keyboardEndFrame toView:nil];
CGRect keyboardFrameBegin = [self.view convertRect:keyboardBeginFrame toView:nil];
newFrame.Origin.y -= (keyboardFrameBegin.Origin.y - keyboardFrameEnd.Origin.y);
self.view.frame = newFrame;
[UIView commitAnimations];
}
ViewDidUnloadとDeallocの両方でキーボードオブザーバーを削除することを忘れないでください。
Swift Versionof @ newton_guima's 誰かがそれを望む場合に備えて、上記の答え。
UIKeyboardWillChangeFrameNotification
のオブザーバーをviewDidLoad()
に追加します。
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardFrameWillChange:", name: UIKeyboardWillChangeFrameNotification, object: nil)
次に、このメソッドを追加します。
func keyboardFrameWillChange(notification: NSNotification) {
let keyboardBeginFrame = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardFrameBeginUserInfoKey)!.CGRectValue
let keyboardEndFrame = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardFrameEndUserInfoKey)!.CGRectValue
let animationCurve = UIViewAnimationCurve(rawValue: (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardAnimationCurveUserInfoKey)!.integerValue)
let animationDuration: NSTimeInterval = (notification.userInfo! as NSDictionary).objectForKey(UIKeyboardAnimationDurationUserInfoKey)!.doubleValue
UIView.beginAnimations(nil, context: nil)
UIView.setAnimationDuration(animationDuration)
UIView.setAnimationCurve(animationCurve!)
var newFrame = self.view.frame
let keyboardFrameEnd = self.view.convertRect(keyboardEndFrame, toView: nil)
let keyboardFrameBegin = self.view.convertRect(keyboardBeginFrame, toView: nil)
newFrame.Origin.y -= (keyboardFrameBegin.Origin.y - keyboardFrameEnd.Origin.y)
self.view.frame = newFrame;
UIView.commitAnimations()
}
次に、ビューから離れる場所、またはdeinit
内のどこにでもオブザーバーを削除します。
NSNotificationCenter.defaultCenter().removeObserver(self)
問題を解決するには、frame
のconstrain
またはtextview
を変更する必要があります。
あなたのための小さなヒント:
通知を使用して、キーボードがいつ表示または非表示になるかを検出します。
通知のサンプル:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
そして、上記のパラメータの1つを変更するよりも。
フレーム変更の例:
- (void)keyboardWillHide:(NSNotification *)notification
{
[self.view layoutIfNeeded];
[UIView animateWithDuration:0.2
animations:^{
[self setStartingFrame:self.commentsView.frame.size.height - commentViewOutlet_.frame.size.height - tabBarOffset_];
[self.view layoutIfNeeded];
}];
}