2011-02-28 59 views
0

的顶部有麻烦隐藏键盘我在玩3项...使用隐形按钮,它坐落在UIScrollView的

1)的UIView坐落在层次结构的基础,包含的UIScrollView。 2)UIScrollview呈现冗长的用户表单。 3)我用来提供“隐藏键盘”功能的UIScrollview上的不可见按钮。

请注意下面的代码,我注册的时候会在键盘出现的时候收到通知,以及当它将要消失的时候。这些工作很好。

我的问题看似是“图层”之一。请参阅下面我将按钮插入视图atIndex:0的位置。这会导致按钮被激活并在滚动视图后面“填充”,以便当您单击它时,滚动视图会抓取触摸并且按钮不知道。没有办法“触及”按钮并禁止键盘。

但是,如果我插入atIndex:1,该按钮会超级强加在文本输入字段的顶部,因此任何触摸都将由按钮执行,立即抑制键盘然后消失。

如何在UIScrollview顶部插入按钮,但在坐在那里的UITextfield后面?其他物流:我有一个 - (void)hidekeyboard函数,我用UIButtion设置为IBAction()。我通过ctrl-drag/drop将UIButton连接到“文件所有者”。 (我需要这两个公约?)

在viewDidLoad中此代码()...

[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *notification){ 

[self.view insertSubview:self.keyboardDismissalButton atIndex:0]; 

}]; 

回答

0

想通了......

这是答案。

下面的代码都在UIViewController的ViewDidLoad()中。首先从UIView中完全删除按钮。 (当键盘被激活时它会被渲染)。

注意下面的键盘“WillShow”通知,我将按钮插入我的UIScrollView层而不是UIView层,如前所述。但是,一旦按钮被点击并且键盘即将被解散,我就从UIView中完全删除按钮(即自己)。

[self.keyboardDismissalButton removeFromSuperview]; 


[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *notification){ 

[theScroller insertSubview:self.keyboardDismissalButton atIndex:0]; 

}]; 



[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:nil usingBlock:^(NSNotification *notification){ 

     [self.keyboardDismissalButton removeFromSuperview]; 

}]; 
0

有没有办法有一个观点是在兄弟姐妹面前,但兄弟姐妹的孩子落后。您可以将该按钮作为滚动视图的子项插入(位于所有文本框的后面),或者您可以覆盖上视图上的pointInside:withEvent:,以便在文本框上方返回false,否则返回true(实际上是“打洞” )。

2

这是一个很好的方式来做到这一点,甚至不需要不可见的按钮。这种方法仅适用于3.2以上的设备,但由于我们已经在NSNotificationCenter上使用了块方法,因此我们知道我们至少在4.0。

代替一个按钮,我们将点击手势识别器添加到我们的视图中。此轻击手势识别器调用-dismissKeyboard:,然后我们要求我们的视图结束所有编辑。此方法仅在3.2及更高版本上可用,并通过它的子视图进行处理,直到它找到当前的第一个响应者并发送它-resignFirstResponder-endEditing:所需的布尔参数决定是否强制firstResponder的退出。该文档有点含糊不清,但我认为如果被迫,将不会调用UITextField上的-textFieldShouldEndEditing委托方法。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *notification) { 
     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard:)]; 
     tap.numberOfTapsRequired = 1; 
     tap.numberOfTouchesRequired = 1; 
     [self.view addGestureRecognizer:tap]; 
    }]; 

    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:nil usingBlock:^(NSNotification *notification) { 
     [self.view removeGestureRecognizer:[self.view.gestureRecognizers lastObject]]; 
    }]; 
} 

- (void)dismissKeyboard:(UIGestureRecognizer *)gesture 
{ 
    [self.view endEditing:NO]; 
} 
+0

谢谢,男人!这是好东西。 – phil 2011-03-02 05:17:49