当前位置:  开发笔记 > IOS > 正文

以编程方式对齐iPhone键盘顶部的工具栏

如何解决《以编程方式对齐iPhone键盘顶部的工具栏》经验,为你挑选了5个好方法。

在某些情况下,我想在iPhone键盘的顶部添加一个工具栏(例如,当您在导航表单元素时,在iPhone Safari中).

目前我正在使用常量指定工具栏的矩形,但是由于界面的其他元素处于不稳定状态 - 工具栏和屏幕顶部的导航栏 - 每次我们进行次要界面更改时,工具栏都会失去对齐.

有没有办法以编程方式确定键盘相对于当前视图的位置?



1> tonklon..:

从iOS 3.2开始,有一种新方法可以实现这种效果:

UITextFieldsUITextViews拥有一个inputAccessoryView属性,您可以将其设置为任何视图,该属性会自动显示在上方并使用键盘进行动画处理.

请注意,您使用的视图既不应该在其他地方的视图层次结构中,也不应该将其添加到某个超级视图中,这是为您完成的.



2> 小智..:

所以基本上:

在init方法中:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil];

然后有上面提到的方法调整条的位置:

-(void) keyboardWillShow:(NSNotification *) note
{
    CGRect r  = bar.frame, t;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &t];
    r.origin.y -=  t.size.height;
    bar.frame = r;
}

可以通过将位置更改设置为动画来使其变得漂亮

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
//...
    [UIView commitAnimations];


在iOS3.2中,甚至有一种更好的新方法可以在UITextField和UITextView上使用inputAccessoryView属性.
这个答案帮助了很多,但有点过时了.您应该使用`UIKeyboardFrameEndUserInfoKey`来获取键盘的最终帧(在屏幕坐标中).您还可以使用`UIKeyboardAnimationDurationUserInfoKey`和`UIKeyboardAnimationCurveUserInfoKey`来获取与键盘行为完全匹配所需的其他参数.
现在只是警告那些绊倒这个问题的人:UIKeyboardBoundsUserInfoKey现在在iPhone OS 3.2中已被弃用.还有其他类似的,例如`UIKeyboardFrameBeginUserInfoKey`,它们提供相同的信息.

3> phi..:

这是基于tonklon的现有答案 - 我只是添加了一个代码片段,在键盘顶部显示了一个半透明的黑色工具栏,右边是一个"完成"按钮:

UIToolbar *toolbar = [[[UIToolbar alloc] init] autorelease];
[toolbar setBarStyle:UIBarStyleBlackTranslucent];
[toolbar sizeToFit];

UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyboard)];

NSArray *itemsArray = [NSArray arrayWithObjects:flexButton, doneButton, nil];

[flexButton release];
[doneButton release];
[toolbar setItems:itemsArray];

[aTextField setInputAccessoryView:toolbar];

-resignKeyboard看起来像:

-(void)resignKeyboard {
  [aTextField resignFirstResponder];
}

希望能帮助别人.


只需添加一些评论就可以获得下一个上一个.UISegmentedControl*segmentControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Previous",@"Next",nil]]; [segmentControl setSegmentedControlStyle:UISegmentedControlStyleBar]; [segmentControl addTarget:self action:@selector(nextPrevious :) forControlEvents:UIControlEventValueChanged];

4> amrox..:

如果您注册键盘通知,即UIKeyboardWillShowNotification UIKeyboardWillHideNotification等,您收到的通知将包含userInfodict(UIKeyboardBoundsUserInfoKey)中键盘的边界.

请参阅UIWindow课程参考.



5> David Beck..:

在3.0及更高版本中,您可以从userInfo通知字典中获取动画持续时间和曲线.

例如,要为视图的大小设置动画以为键盘腾出空间,请注册UIKeyboardWillShowNotification并执行以下操作:

- (void)keyboardWillShow:(NSNotification *)notification
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];

    CGRect frame = self.view.frame;
    frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height;
    self.view.frame = frame;

    [UIView commitAnimations];
}

做一个类似的动画UIKeyboardWillHideNotification.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有