【问题标题】:UIPanGestureRecognizer and BringSubviewToFrontUIPanGestureRecognizer 和 BringSubviewToFront
【发布时间】:2013-04-13 22:49:54
【问题描述】:

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

- (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 *)sender view]] 似乎没有效果。那么我该如何修改我的代码,以便应用程序将点击层带到顶部呢?

感谢您的帮助。

【问题讨论】:

    标签: ios6 uipangesturerecognizer


    【解决方案1】:

    一个好的方法是创建 UIImageView 的 CustomImageView 子类。您将 UIPanGestureRecognizer 附加到 CustomImageView 的每个实例,并将该实例设置为它的目标。然后手势触发的action方法是在view本身实现的,这样就可以用self引用view:

    buttonClicked

        MyImageView* imageview = [[MyImageView alloc] initWithFrame:CGRectMake(100, 0, 300, 22)];
        UIPanGestureRecognizer *imageviewGesture = 
        [[UIPanGestureRecognizer alloc] initWithTarget:imageview 
                                                action:@selector(recognizePan:)];
    

    CustomImageView.m

        - (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 执行此操作,就像您正在做的那样,通过访问gestureRecongnizer 的view 属性。你的错误就在这里:

    - (void)recognizePan:(UIPanGestureRecognizer *)sender {
         [[[(UITapGestureRecognizer *)sender view] layer] removeAllAnimations];
    

    您正在将发件人类型从 UIPanGestureRecognizer 更改为 UITapGestureRecognizer。事实上,您不需要在方法体中进行任何 sender 类型转换。

    【讨论】:

    • @TBlue,你说的很对,我没有想清楚......但这仍然留下了一个问题,为什么你的不工作?我的工作,它基本上和你做同样的工作......
    • 谢谢。这应该得到纠正。实际上,我发布的内容似乎可以使用或不使用拼写错误。我犯的一个在我的代码中不明显的错误是我在 [self.view addSubview:imageview] 之后包含了 TextView。我猜这搞砸了。
    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多