点击手势识别器-轻拍了哪个对象?

2020/11/30 22:31 · ios ·  · 0评论

我是手势识别器的新手,所以也许这个问题听起来很愚蠢:我正在将轻击手势识别器分配给一堆UIViews。在该方法中,可以找出以某种方式点击了其中的哪个,还是我需要使用屏幕上点击的点来找到它?

for (NSUInteger i=0; i<42; i++) {
        float xMultiplier=(i)%6;
        float yMultiplier= (i)/6;
        float xPos=xMultiplier*imageWidth;
        float yPos=1+UA_TOP_WHITE+UA_TOP_BAR_HEIGHT+yMultiplier*imageHeight;
        UIView *greyRect=[[UIView alloc]initWithFrame:CGRectMake(xPos, yPos, imageWidth, imageHeight)];
        [greyRect setBackgroundColor:UA_NAV_CTRL_COLOR];

        greyRect.layer.borderColor=[UA_NAV_BAR_COLOR CGColor];
        greyRect.layer.borderWidth=1.0f;
        greyRect.userInteractionEnabled=YES;
        [greyGridArray addObject:greyRect];
        [self.view addSubview:greyRect];
        NSLog(@"greyGrid: %i: %@", i, greyRect);

        //make them touchable
        UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter)];
        letterTapRecognizer.numberOfTapsRequired = 1;
        [greyRect addGestureRecognizer:letterTapRecognizer];
    }

highlightLetter:使用以下参数定义目标选择器():

UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];

然后您可以通过查看

- (void)highlightLetter:(UITapGestureRecognizer*)sender {
     UIView *view = sender.view; 
     NSLog(@"%d", view.tag);//By tag, you can find out where you had tapped. 
}

问了这个问题已经一年了,但仍然有人问。

UITapGestureRecognizer特定视图上声明时,将标签分配为

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandlerMethod:)];
[yourGestureEnableView addGestureRecognizer:tapRecognizer];
yourGestureEnableView.tag=2;

并在您的处理程序中这样做

-(void)gestureHandlerMethod:(UITapGestureRecognizer*)sender {
    if(sender.view.tag == 2) {
        // do something here
    }
}

这是Swift 3的更新,也是Mani的回答的补充。我建议将其sender.view与标记UIViews(或其他元素,具体取决于您要跟踪的内容)结合使用,以获得更“高级”的方法。

  1. 将UITapGestureRecognizer添加到例如UIButton(也可以将其添加到UIViews等)中,或者将整个项目集中在带有for循环和第二个用于敲击手势的数组中。
    let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction)) 
    yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
  1. 在同一个testController中定义函数(这是您的View Controller的名称)。我们将在此处使用标签-标签是Int ID,您可以使用将它们添加到UIView中yourButton.tag = 1如果您有动态的元素列表(例如数组),则可以创建一个for循环,该循环遍历数组并添加一个标签,该标签会逐渐增加

    func yourFunction(_ sender: AnyObject) {
        let yourTag = sender.view!.tag // this is the tag of your gesture's object
        // do whatever you want from here :) e.g. if you have an array of buttons instead of just 1:
        for button in buttonsArray {
          if(button.tag == yourTag) {
            // do something with your button
          }
        }
    }
    

所有这些的原因是因为当与#selector结合使用时,您无法为yourFunction传递更多参数。

如果您有一个更加复杂的UI结构,并且想要获得附加到您的点击手势的项的父标签,则可以使用,let yourAdvancedTag = sender.view!.superview?.tag例如,在该UIView中获取按下按钮的UIView标签;对缩略图+按钮列表等有用。

很快就很简单

在ViewDidLoad()函数中编写此代码

let tap = UITapGestureRecognizer(target: self, action: #selector(tapHandler(gesture:)))
    tap.numberOfTapsRequired = 2
    tapView.addGestureRecognizer(tap)

可能在viewDidLoad中或在viewDidLoad外部的处理程序部分,连击放在扩展中

@objc func tapHandler(gesture: UITapGestureRecognizer) {
    currentGestureStates.text = "Double Tap"
} 

在这里,我只是通过打印输出来测试代码,如果您想采取行动,您可以做任何您想做的事或更多的练习和阅读

在Swift中使用此代码

func tappGeastureAction(sender: AnyObject) {
    if let tap = sender as? UITapGestureRecognizer {
        let point = tap.locationInView(locatedView)
        if filterView.pointInside(point, withEvent: nil) == true {
            // write your stuff here                
        }
    }
}

您可以使用

 - (void)highlightLetter:(UITapGestureRecognizer*)sender {
     UIView *view = sender.view; 
     NSLog(@"%d", view.tag); 
}

视图将是识别轻击手势的对象

您也可以使用UIGestureRecognizer的“ shouldReceiveTouch”方法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:     (UITouch *)touch {
     UIView *view = touch.view; 
     NSLog(@"%d", view.tag); 
}    

不要忘记设置手势识别器的代表。

您应该修改手势识别器的创建以接受参数(添加冒号“:”)

UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];

在您的方法中,highlightLetter:您可以访问附加到识别器的视图:

-(IBAction) highlightLetter:(UITapGestureRecognizer*)recognizer
{
    UIView *view = [recognizer view];
}

典型的2019年示例

假设您有一张FaceView类似的图片。您将在屏幕上(或在集合视图,表,堆栈视图或其他列表中)许多视图。

在课堂上,FaceView您将需要一个变量“ index”

class FaceView: UIView {
   var index: Int

这样每个FaceView都可以自我感知屏幕上的“哪张”面孔。

因此,您必须添加var index: Int到有问题的课程中。

因此,您要在屏幕上添加许多FaceView ...

let f = FaceView()
f.index = 73
.. you add f to your stack view, screen, or whatever.

现在,您将点击添加到f

f.addGestureRecognizer(UITapGestureRecognizer(target: self,
                           action: #selector(tapOneOfTheFaces)))

这是秘密:

@objc func tapOneOfTheFaces(_ sender: UITapGestureRecognizer) {
    if let tapped = sender.view as? CirclePerson {
        print("we got it: \(tapped.index)")

现在,您知道在表,屏幕,堆栈视图或其他任何内容中单击了“哪个”面。

就这么简单。

如果要UIGestureRecognizer在不同的UIViews添加不同的内容并想在action方法中加以区分,则可以在sender参数中检查属性视图,这将为您提供sender视图。

func tabGesture_Call
{
     let tapRec = UITapGestureRecognizer(target: self, action: "handleTap:")
     tapRec.delegate = self
     self.view.addGestureRecognizer(tapRec)
     //where we want to gesture like: view, label etc
}

func handleTap(sender: UITapGestureRecognizer) 
{
     NSLog("Touch..");
     //handling code
}

迅捷5

就我而言,我需要访问被单击的UILabel,因此您可以在手势识别器中执行此操作。

let label:UILabel = gesture.view as! UILabel

pose.view属性包含单击内容的视图,您可以将其向下转换为您所知道的内容。

@IBAction func tapLabel(gesture: UITapGestureRecognizer) {

        let label:UILabel = gesture.view as! UILabel

        guard let text = label.attributedText?.string else {
            return
        }

        print(text)
}

因此,您可以对tapLabel函数执行类似的操作,并在viewDidLoad中放置...

<Label>.addGestureRecognizer(UITapGestureRecognizer(target:self, action: #selector(tapLabel(gesture:))))

只需替换<Label>为您的实际标签名称

本文地址:http://ios.askforanswer.com/dianjishoushishibieqi-qingpailenageduixiang.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!