有没有办法通过 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
继承了 UIGestureRecognizer
的 view
属性,您可以使用它来放大该点击手势识别器的视图:
- (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 发送对象?的主要内容,如果未能解决你的问题,请参考以下文章