2011-05-05 57 views
4

我刚开始学习编程iPhone应用程序,我似乎无法弄清楚在键盘出现时如何让视图滑出来(所以你仍然可以看到你输入的文本字段)。它是如何完成的?使视图向上滑动,为键盘腾出空间?

+2

Michael Tyson已经编写了一个自动化的组件:[用于移动文本字段的一种通用解决方案,不受键盘影响](http://atastypixel.com/blog/a-drop-in-universal - 溶液换移动文本字段,遥遥的最键盘/)。 – 2011-05-05 03:27:47

+0

该链接真的很好!谢谢! – BlackHatSamurai 2013-05-21 03:33:52

回答

2

如果视觉上没问题,最简单的方法是移动整个self.view.frame,然后在完成后将其移回原位。

static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3f; 

- (void) animateForToNewYPosition:(int)newYPosition { 
    // move for kdb 
    if (self.view.frame.origin.y == newYPosition) { 
     return; 
    } 

    // start animation 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [UIView beginAnimations:nil context:context]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION]; 

    // move it 
    self.view.frame.origin.y = newYPosition; 

    [UIView commitAnimations]; 
} 
+0

谢谢,正是我需要的! – Ryan 2011-05-06 00:50:46

+0

如何给这个方法打电话? – kendotwill 2015-01-22 03:59:11

+0

使用UITextField委托,你可以把调用animateForToNewYPosition:在委托方法textFieldDidBeginEditing:一个很好的例子/答案在这里:http://stackoverflow.com/a/17887070/203960 – dredful 2015-01-22 05:09:20

1

这样做的一种方法是在UIScrollView中包含所有内容,然后向上滚动内容。另一种方法是自己移动视图,通常在Core Animation的帮助下,使其看起来不错。

一个很好的起点是文档。甚至还有一个标有Moving Content That Is Located Under the Keyboard的标签,它会指引您正确的方向。

+0

好的,我如何使用UIScrollView来做到这一点? – Ryan 2011-05-05 03:17:11

+0

在上面添加了一个链接,告诉你你需要知道什么。 – Caleb 2011-05-05 03:25:10

0

假设你需要移动起来视图上的文本字段,标签是4(当你有超过1个TXT领域,并通过键盘覆盖其中的一个),然后使用文本框的委托方法

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
if(textField.tag==4) 
    CGRect viewFrame; 
    viewFrame=self.view.frame; 
    if(viewFrame.origin.y==-100) 
    { 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:.3]; 
     viewFrame.origin.y+=100; 
     self.view.frame=viewFrame; 
     [UIView commitAnimations]; 
    } 

} 

这会移动您的视图。现在向下移动,你需要在文本框代码anothe委托方法

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    if(textField.tag==4) 
{ 
CGRect viewFrame; 
    viewFrame=self.view.frame; 
    if(viewFrame.origin.y==-100) 
    { 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:.3]; 
     viewFrame.origin.y+=100; 
     self.view.frame=viewFrame; 
     [UIView commitAnimations]; 
    } 
} 
} 

在TextView的情况下,你需要一个按钮,移动你的观点,你需要这个代表

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView 

,并使用相同的代码textField

向下移动需要在导航栏中添加一个按钮,或者在工具栏中添加按钮,并通过相同的动画在键盘上设置该工具栏。对于按钮,您需要使用相同的代码向下移动,这适用于textField。

希望这有助于你。

+0

我把这个在ViewController文件中,对?它应该被自动调用吗?它不适合我... – Ryan 2011-05-08 03:54:35

+0

您需要为textField委托与文件所有者建立连接,或者以编程方式编写yourTxtField.delegate = self;然后这些由self调用的委托方法 – Ishu 2011-05-09 03:53:29

0
http://objectivecwithsuraj.blogspot.in/2012/06/making-view-slide-up-to-make-room-for.html 

    Add a UIScrollview - scrollview to your UIView and set delegates for UITextFields & 
    UIScrollview 

    - (BOOL)textFieldShouldReturn:(UITextField *)textField 
    { 
    if (textField == txtFieldName) 
    { 
     [txtFieldCellNo becomeFirstResponder]; 
    } 
    else if (textField == txtFieldCellNo) 
    { 
     [txtFieldEmail becomeFirstResponder]; 
    } 
    else 
    { 
     [textField resignFirstResponder]; 

    } 
return YES; 
} 

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    [self animateTextField:txtFieldName up:YES]; 
} 


- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    [self animateTextField:txtFieldEmail up:NO]; 
} 


- (void) animateTextField: (UITextField*) textField up: (BOOL) up 
{ 
    const int movementDistance = 80; 
    const float movementDuration = 0.3f; 
    int movement = (up ? -movementDistance : movementDistance); 
    [UIView beginAnimations: @"anim" context: nil]; 
    [UIView setAnimationBeginsFromCurrentState: YES]; 
    [UIView setAnimationDuration: movementDuration]; 
    self.view.frame = CGRectOffset(self.view.frame,0, movement); 
    [UIView commitAnimations]; 

}

0

我发现,使用键盘工作的通知我的应用程序比使用textFieldDidBeginEditing和textFieldDidEndEditing的的UITextField委托协议更好。通知是keyboardWillShow和keyboardWillHide。可以测试UITextField或UITextView,这需要视图随这些通知一起移动,然后有条件地移动视图。我的应用程序的优点是我有很多UITextTields,通知可以让编辑从一个字段移动到另一个字段时,更容易将视图保留在键盘上方。

相关问题