有没有办法通过 UITapGestureRecognizer 发送对象?

Posted

技术标签:

【中文标题】有没有办法通过 UITapGestureRecognizer 发送对象?【英文标题】:Is there a way to send an object via UITapGestureRecognizer? 【发布时间】:2014-02-20 17:17:23 【问题描述】:

我有一个从 UIView 类型的类创建的对象,以生成无限数量的视图,然后这些视图以较小的尺寸出现在屏幕中间。我使用 UITapGestureRecognizer 来放大其中一个视图以适应屏幕,但这里的问题是该对象只能在第一类中使用,不能转移到第二类,即选择器。 您对这个特定问题有什么建议? 如何将我的对象发送到选择器以便能够在那里使用它? 谢谢

这是创建对象的第一个类(从 iCarousel 派生):

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view

    UILabel *label = nil;
    UIButton *close = [UIButton buttonWithType:UIButtonTypeRoundedRect];


    //create new view if no view is available for recycling
    if (view == nil)
    


        view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320.0f, 460.0f)];
        view.contentMode = UIViewContentModeCenter;

        view.backgroundColor = [UIColor whiteColor];

        label = [[UILabel alloc] initWithFrame:CGRectMake(100, -100, 100, 100)];
        label.backgroundColor = [UIColor clearColor];
        label.textAlignment = NSTextAlignmentCenter;
        label.font = [label.font fontWithSize:50];
        label.tag = 1;
        [view addSubview:label];

        close.frame = CGRectMake(0, 0, 30, 30);
        [close setTitle:@"x" forState:UIControlStateNormal];
        close.titleLabel.font = [UIFont systemFontOfSize:25];
        [close addTarget:self action:@selector(closeMe:) forControlEvents:UIControlEventTouchUpInside];

        [view addSubview:close];


        UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapToMaximize:)];
        tap.numberOfTapsRequired = 1;
        [view addGestureRecognizer:tap];

    
    else
    

        //get a reference to the label in the recycled view
        label = (UILabel *)[view viewWithTag:1];

    


    label.text = [items[index] stringValue];

    return view;

还有选择器:

- (void)tapToMaximize:(UITapGestureRecognizer*)recognizer 

    [UIView animateWithDuration:0.3
                          delay:0
                        options:UIViewAnimationOptionCurveLinear
                     animations:^
                         carousel.transform = CGAffineTransformMakeScale(1, 1);

                     
                     completion:^(BOOL finished) 
                     ];


所以我不想使用代表所有视图的“轮播”,而是使用“视图”,这样我只能放大当前视图而不是所有视图。

【问题讨论】:

你能贴出代码来说明你是如何设置的吗? 【参考方案1】:

UITapGestureRecognizer 继承了 UIGestureRecognizerview 属性,您可以使用它来放大该点击手势识别器的视图:

- (void)tapToMaximize:(UITapGestureRecognizer*)recognizer 

    UIView *viewToMaximize;
    if ([recognizer.view isEqual:_maximizedView]) 
        viewToMaximize = nil;
     else 
        viewToMaximize = recognizer.view;
    
    UIView *viewToUnmaximize = _maximizedView; // _maximizedView should be an instance variable on your view controller

    [UIView animateWithDuration:0.3
                          delay:0
                        options:UIViewAnimationOptionCurveLinear
                     animations:^
                         viewToMaximize.transform = CGAffineTransformMakeScale(1.1, 1.1);
                         viewToUnmaximize.transform = CGAffineTransformIdentity;
                     
                     completion:^(BOOL finished) 
                     ];

    _maximizedView = viewToMaximize;

另外,CGAffineTransformMakeScale(1, 1) 会将视图缩放到其原始大小,所以我在我的代码 sn-p 中提高了比例。

【讨论】:

如果他正在尝试缩放轮播,那么这里的 viewToMaximize 不应该是识别器.view,这就是手势附加到的视图 - 很可能是 self.view。 在帖子的最后,@user2828182 表示他正在尝试缩放view(手势识别器所连接的位置),不是整个轮播。 非常感谢奥斯汀!您的解决方案确实有效。我不得不将比例增加到 1.45 以获得所需的大小,因为比例为 1 时没有任何反应,这有点奇怪。我将最大化视图声明为这样的属性:@property (nonatomic, strong) UIView* minimizedView;这是正确的还是我应该以不同的方式做?再次感谢奥斯汀! 好吧,我注意到,如果我第二次点击当前视图,它会缩小到原来的大小,但如果我第三次点击它并无限大,它会一直在新大小和旧尺寸很快就像一颗跳动的心脏什么的。我该如何解决这个问题? 编辑代码,使其不会尝试最大化和已经最大化的视图【参考方案2】:

如果我理解正确,您想转换您点击的 UIView,应该是轮播?

假设您将点击手势识别器添加到 self.view,那么这就是您获得刚刚点击的视图的方式:

- (void)tapToMaximize:(UITapGestureRecognizer*)recognizer

    UIView *view = [self.view hitTest:[recognizer locationInView:self.view] withEvent:nil];
    // you can now check to see if this view is the carousel

一旦您知道您是否点击了轮播,您就可以将其存储、传递给另一个班级、对其进行转换或任何您喜欢的方式。

【讨论】:

感谢 bpercevic 不厌其烦地回答我的问题。它可以工作,但是如果我放大一个视图,一旦我点击另一个视图进行放大,它就不会恢复到原来的大小。奥斯汀很适合我。谢谢你俩。真的很感激。

以上是关于有没有办法通过 UITapGestureRecognizer 发送对象?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法通过营业时间过滤谷歌地方餐厅?

有没有办法通过另一个帐户进行 youtube 直播

有没有办法通过类型表语法排除组件?

有没有办法通过 Javascript 删除 Azure Blob 容器文件?

有没有办法通过信号发送值

有没有办法通过 Qt WebChannel 使用同步函数调用?