首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIPanGestureRecognizer和BringSubviewToFront

UIPanGestureRecognizer和BringSubviewToFront
EN

Stack Overflow用户
提问于 2013-04-13 22:49:54
回答 1查看 434关注 0票数 1

我有一个应用程序,用户点击一个按钮,应用程序将实例化一个图像层(UIImageView).。我想使它,以便用户可以移动选定的图像层,无论他们点击。在阅读了一些主题后,我了解到我可以使用UIPanGestureRecognizer移动选定的图像层。

代码语言:javascript
复制
- (IBAction)buttonClicked:(id)sender {
    imageview = [[UIImageView alloc] initWithFrame:CGRectMake(100, 0, 300, 22)];
    UIPanGestureRecognizer *imageviewGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(recognizePan:)];
    [imageviewGesture setMinimumNumberOfTouches:1];
    [imageviewGesture setMaximumNumberOfTouches:1];
    imageview.image = [UIImage imageNamed:@"pinimage.png"];
    [imageview addGestureRecognizer:imageviewGesture];
    [imageview setUserInteractionEnabled:YES];
    [self.view addSubview:imageview];
    NSUInteger currentag = [self UniqueTag]; // Assigning a unique integer
    imageview.tag = currentag;
}

- (void)recognizePan:(UIPanGestureRecognizer *)sender {
    [[[(UITapGestureRecognizer *)sender view] layer] removeAllAnimations];
    [self.view bringSubviewToFront:[(UIPanGestureRecognizer *)sender view]];
    CGPoint translatedPoint = [(UIPanGestureRecognizer *)sender translationInView:self.view];

    if([(UIPanGestureRecognizer *)sender state] == UIGestureRecognizerStateBegan) {     
        firstX = [[sender view] center].x;
        firstY = [[sender view] center].y;
    }

    translatedPoint = CGPointMake(firstX + translatedPoint.x,firstY + translatedPoint.y);
    [[sender view] setCenter:translatedPoint];
}

现在,我不明白的是,当有多个图像层时,如何将被点击的图层带到前面。[self.view bringSubviewToFront:(UIPanGestureRecognizer *)发件人视图]似乎并不有效。那么,我如何修改我的代码,以便应用程序将被点击的层带到顶部?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-14 01:16:29

这样做的一个好方法是创建一个CustomImageView子类UIImageView。将UIPanGestureRecognizer附加到CustomImageView的每个实例,并将该实例设置为它的目标。然后,在视图本身中实现由手势触发的操作方法,以便您可以使用self引用视图。

buttonClicked

代码语言:javascript
复制
    MyImageView* imageview = [[MyImageView alloc] initWithFrame:CGRectMake(100, 0, 300, 22)];
    UIPanGestureRecognizer *imageviewGesture = 
    [[UIPanGestureRecognizer alloc] initWithTarget:imageview 
                                            action:@selector(recognizePan:)];

CustomImageView.m

代码语言:javascript
复制
    - (void)recognizePan:(UIPanGestureRecognizer *)sender {
        [self.layer removeAllAnimations];
        [self.superview bringSubviewToFront:self];
        CGPoint translatedPoint = [sender translationInView:self];
        if([sender state] == UIGestureRecognizerStateBegan) {
            self.firstX = [self center].x;
            self.firstY = [self center].y;
        }
        translatedPoint = CGPointMake(self.firstX + translatedPoint.x,
                                      self.firstY + translatedPoint.y);
        [self setCenter:translatedPoint];
    }

更新

不直截了当--您当然可以通过访问viewController的view属性来做到这一点,就像您正在做的那样。你的错误就在这里:

代码语言:javascript
复制
- (void)recognizePan:(UIPanGestureRecognizer *)sender {
     [[[(UITapGestureRecognizer *)sender view] layer] removeAllAnimations];

您正在将发送方类型从UIPanGestureRecognizer更改为UITapGestureRecognizer。实际上,您不需要在方法的主体中执行任何sender类型转换。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15993799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档