我正在尝试将UIPicker实现为UITextField内容的自定义“编辑”输入。
到目前为止我有这个:
public override void ViewDidLoad ()
{
// ... snip
tb_status.EditingDidBegin += delegate {
//prevent keyboard from popping up
tb_status.ResignFirstResponder();
TogglePDCASelect();
};
tb_status.ShouldReturn = (textField) => {
TogglePDCASelect();
textField.ResignFirstResponder();
return true;
};
// ... snip
private void TogglePDCASelect()
{
pc_PDCAPicker.Hidden = !pc_PDCAPicker.Hidden;
if(pc_PDCAPicker.Hidden)
{
//AccomodateResponder accomodates the UIScrollView `vwDetails` so that there is room for the responder
//and recalculates the scroll content size.
//deaccomodate does the reverse.
scrollViewer.DeAccomodateResponder(vwDetails);
}
else
{
scrollViewer.AccomodateResponder(vwDetails, tb_status.Frame);
}
}
到目前为止,非常好,但是当我点击调用选择器的文本框,然后点击普通文本字段或切换vwDetails子视图时,选择器仍保持在视图中。
像这样设置起来似乎很痛苦。 我做错了吗?有什么方法可以让选择器像默认的第一响应者(键盘)一样运行?
答案 0 :(得分:3)
因此,如果我理解正确,您基本上想要为该特定文本字段使用自定义键盘/输入?
您可以使用自己的自定义UITextField
覆盖InputView
的{{1}},当它成为第一响应者时,它将显示而不是键盘。
编辑
您的选择器UIView
将为空,这就是为什么这不起作用。您需要创建一个新的InputView
并将其分配给UIView
的{{1}}。因此,如果您将选择器添加到此视图,则应显示您的选择器。
一个简单的代码示例:(我没有时间来验证这是100%正确但是应该让你继续前进)
tb_status
答案 1 :(得分:1)
让我们说你的视图是320 x 480.所以最初你的选择器应该有框架为x,320,宽度,高度。
现在,当用户编辑文本字段时,使用UIView动画将选取器框架设置为某个可见高度,如下所示。
-(void) presentPickerView{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3f];
CGRect viewFrame = self.pickerView.frame;
viewFrame.origin.y -= self.pickerView.bounds.size.height;
self.pickerView.frame = viewFrame;
[UIView commitAnimations];
}
-(void) dismissPickerView {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3f];
CGRect viewFrame = self.pickerView.frame;
viewFrame.origin.y += self.pickerView.bounds.size.height;
self.pickerView.frame = viewFrame;
[UIView commitAnimations];
}
编辑此textField时无需查看键盘,因此请在此处返回NO。
-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField {
if ([textField isEqual:myTextField]) {
[self presentPickerView];
return NO;
}
return YES;
}
完成文本字段编辑后,将选择器设置为动画。
- (void)textFieldDidEndEditing:(UITextField *)textField {
if ([textField isEqual:myTextField]) {
// Animate picker down back again.
[self dismissPickerView];
}
}