在我的添加联系人页面中,我有一个视图和一个滚动视图,并再次显示它上面的视图。在最后一个视图中我有文本框等,我已经给出了'touchesBegan'方法,但它仅在底部的视图中调用。如何将该方法指向另一个视图,即顶部的视图?
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.AddView endEditing:YES];
}
答案 0 :(得分:27)
这就是你可以做的一种方式:
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch= [touches anyObject];
if ([touch view] == image1)
{
//Action
}
}
请注意:当您使用UIScrollView时,您可能无法获得UIScrollView的触摸方法。在这种情况下,您可能必须使用UIGesture。
答案 1 :(得分:7)
以下是Swift的答案:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
let touch = touches.first as! UITouch
if(touch.view == myView){
// Code
}
}
答案 2 :(得分:6)
首先检查整个控件的属性UserInteractionEnabled
并设置为YES
查看底部视图框后,该视图未显示
然后你可以用波纹状况检查出来并用特定的控件触摸事件......
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
[touch locationInView:viewBoard];
if([touch.view isKindOfClass:[UIImageView class]])
{
UIImageView *tempImage=(UIImageView *) touch.view;
if (tempImage.tag == yourImageTag)
{
/// write your code here
}
}
}
答案 3 :(得分:4)
试试这个:
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch1 = [touches anyObject];
CGPoint touchLocation = [touch1 locationInView:self.finalScore];
if(CGRectContainsPoint(YourView.frame, touchLocation));
{
//Do stuff.
}
}
答案 4 :(得分:1)
试
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event touchesForView:vTouch] anyObject];
if(!touch)
return;
CGPoint pointNow = [touch locationInView:otherView];
{
// code here
}
}
答案 5 :(得分:0)
Referring to the Apple documentation on UIResponder,所有UIView对象(包括UIWindow),UIApplication对象,UIViewController对象都是UIResponder的实例。要处理特定类型的事件,响应者必须重写相应的方法。
在我们的情况下,touches
是我们的事件类型。因此,我们的响应者应实施以下方法。
touchesBegan(:with :),touchesMoved(:with :),touchesEnded(:with :)和touchesCancelled(:with :)
由于我们只希望知道用户何时触摸了特定视图,因此我们只需要实现touchesBegan(_:with:)
。由于我们没有覆盖其他方法,因此必须调用super.touchesBegan(touches, with: event)
。如果我们要覆盖其他方法的 ALL ,则不需要调用super
。
看着touchesBegan(_:with:)
,参数touches
是一组UITouch实例。每个实例代表事件开始阶段的触摸,由参数event
表示。
对于视图中的触摸,默认情况下此集合仅包含一个触摸。因此,touches.first
是集合中唯一的UITouch实例。然后,我们访问属性view
,该属性表示触摸发生的视图或窗口。最后,我们将触摸过的视图与所需的视图进行比较。
请注意,如果您希望接收多次触摸,则必须将视图的isMultipleTouchEnabled
属性设置为true
。然后touches
的集合将有多个UITouch实例,您将必须相应地进行处理。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
if let touch = touches.first, touch.view == myView {
// Do something
}
}
答案 6 :(得分:0)
如果您的视图是父视图,则可以使用以下代码:
if let touch = touches.first {
let position = touch.location(in: yourView)
let pnt: CGPoint = CGPoint(x: position.x, y: position.y)
if (yourView.bounds.contains(pnt)) {
//You can use: yourView.frame.contains(pnt)
//OK.
}
}