关于这个问题有很多答案,但大多数都来自几年前,似乎没有一个令人满意。
对于只有三个文本字段和提交按钮的登录屏幕,我希望当键盘显示得足够时,视图会向上移动,这样当字段未被隐藏时,它也不会向上移出视图。所需的移动量使得提交按钮在键盘上方固定的距离。虽然可以通过在页面上向上移动字段来为键盘留出空间,但提交按钮仍然是隐藏的
我尝试添加以下内容:
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
[self animateTextField:textField up:YES];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[self animateTextField:textField up:NO];
}
-(void)animateTextField:(UITextField*)textField up:(BOOL)up
{
const int movementDistance = -200; // tweak as needed
const float movementDuration = 0.3f; // tweak as needed
int movement = (up ? movementDistance : -movementDistance);
[UIView beginAnimations: @"animateTextField" context: nil];
[UIView setAnimationBeginsFromCurrentState: YES];
[UIView setAnimationDuration: movementDuration];
self.view.frame = CGRectOffset(self.view.frame, 0, movement);
[UIView commitAnimations];
}
这会将视图向上移动一个固定的数量,但是这些字段对于编辑是不可见的,即它们太高了。
另一个答案建议:
Browser("CreationTime:=1").GetROProperty("OpenURL")
我无法弄清楚如何实现这一点。如果你只是离开它,没有任何反应。我猜你应该用文本域的名称重命名文本字段,但在这种情况下,你会为每个文本字段做吗?我无法让它产生任何影响。
另一个建议是使用TPKeyboardAvoiding等类别,但这需要一个我不需要的滚动视图。
2015年这个问题没有直接的解决方案吗?
感谢您的任何建议/指导。
答案 0 :(得分:9)
以下动画将在用户开始输入时将您的视图(在本例中为viewForLogin)移动200像素。当文本字段结束编辑时,视图将动画回原始位置。不要忘记设置文本字段的代理。
Swift 3
func textFieldDidBeginEditing(_ textField: UITextField) {
UIView.animate(withDuration: 0.3, animations: {
self.view.frame = CGRect(x:self.view.frame.origin.x, y:self.view.frame.origin.y - 200, width:self.view.frame.size.width, height:self.view.frame.size.height);
})
}
func textFieldDidEndEditing(_ textField: UITextField) {
UIView.animate(withDuration: 0.3, animations: {
self.viewSupport.frame = CGRect(x:self.viewSupport.frame.origin.x, y:self.viewSupport.frame.origin.y + 200, width:self.viewSupport.frame.size.width, height:self.viewSupport.frame.size.height);
})
}
<强>目标C 强>
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:.3];
[UIView setAnimationBeginsFromCurrentState:TRUE];
self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y -200., self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:.3];
[UIView setAnimationBeginsFromCurrentState:TRUE];
self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y +200., self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];
}
答案 1 :(得分:5)
SWIFT 爱好者 干得好。不过,我已经将这段代码与UIView一起使用了。您应该能够对scrollview进行这些调整。
func addKeyboardNotifications() {
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardWillShow(notification:)),
name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardWillHide(notification:)),
name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
// if using constraints
// bottomViewBottomSpaceConstraint.constant = keyboardSize.height
self.view.frame.origin.y -= keyboardSize.height
UIView.animate(withDuration: duration) {
self.view.layoutIfNeeded()
}
}
}
func keyboardWillHide(notification: NSNotification) {
let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
//if using constraint
// bottomViewBottomSpaceConstraint.constant = 0
self.view.frame.origin.y = 0
UIView.animate(withDuration: duration) {
self.view.layoutIfNeeded()
}
}
不要忘记在正确的位置删除通知。
func removeKeyboardNotifications() {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
答案 2 :(得分:2)
#define DEVICE_HEIGHT [[UIScreen mainScreen] bounds].size.height
-(void)viewDidLoad {
[super viewDidLoad];
// register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:self.view.window];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:self.view.window];
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// unregister for keyboard notifications while not visible.
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardWillShowNotification
object:self.view.window];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardWillHideNotification
object:self.view.window];
}
-(void)keyboardWillShow:(NSNotification *)noti
{
NSDictionary* userInfo = [noti userInfo];
CGRect keyboardRect = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]
CGRectValue];
keyboardRect = [self.view convertRect:keyboardRect fromView:nil];
CGRect viewFrame = self.view.frame;
viewFrame.size.height = DEVICE_HEIGHT - CGRectGetHeight(keyboardRect);
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.1];
[UIView setAnimationBeginsFromCurrentState:YES];
self.view.frame = viewFrame;
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height
- self.view.bounds.size.height);
[self.scrollView setContentOffset:bottomOffset animated:NO];
[UIView commitAnimations];
}
-(void)keyboardWillHide:(NSNotification *)noti
{
NSDictionary* userInfo = [noti userInfo];
CGRect keyboardRect = [[userInfo
objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];
keyboardRect = [self.view convertRect:keyboardRect fromView:nil];
CGRect viewFrame = self.view.frame;
viewFrame.size.height = DEVICE_HEIGHT;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.1];
[UIView setAnimationBeginsFromCurrentState:YES];
self.view.frame = viewFrame;
[UIView commitAnimations];
}