拖动带有阴影的自定义 UIView - 大小重置和阴影消失

Posted

技术标签:

【中文标题】拖动带有阴影的自定义 UIView - 大小重置和阴影消失【英文标题】:Dragging custom UIView with shadow - the size resets and shadow disappears 【发布时间】:2014-03-04 20:14:12 【问题描述】:

在 Xcode 5 中,我创建了带有 5 个“字母图块”的an iPhone app,可以拖动它们:

图块被实现为Tile 类,利用Tile.xib(此处为fullscreen):

tile.png 是一个没有阴影的小图像:

dragged.png 是带有阴影的大图:

后一张图片由touchesBegan在Tile.m中显示:

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event

    _background.image = kDragged;
    [_letter setFont:[UIFont systemFontOfSize:48]];
    [_value setFont:[UIFont systemFontOfSize:20]];

    [self.superview bringSubviewToFront:self];

    [super touchesBegan:touches withEvent:event];


- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event

    _background.image = kTile;
    [_letter setFont:[UIFont systemFontOfSize:36]];
    [_value setFont:[UIFont systemFontOfSize:16]];

    [super touchesEnded:touches withEvent:event];


- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event

    _background.image = kTile;
    [_letter setFont:[UIFont systemFontOfSize:36]];
    [_value setFont:[UIFont systemFontOfSize:16]];

    [super touchesCancelled:touches withEvent:event];

并且拖动是通过在ViewController.m 中使用UIPanGestureRecognizer 来完成的:

- (IBAction)dragTile:(UIPanGestureRecognizer *)recognizer

    Tile* tile = (Tile*)recognizer.view;
    UIView* parent = tile.superview;

    if (recognizer.state == UIGestureRecognizerStateBegan ||
        recognizer.state == UIGestureRecognizerStateChanged) 

        CGPoint translation = [recognizer translationInView:parent];

        [tile setCenter:CGPointMake(tile.center.x + translation.x,
                                    tile.center.y + translation.y)];

        [recognizer setTranslation:CGPointZero inView:parent];
    

我的问题是:

当我触摸一个图块时,它的大小会增加并显示阴影(这没关系)。

但是一旦我开始拖动图块,它的大小就会重置为小而没有阴影(我不明白)。

我在touchesEndedtouchesCancelled 设置了断点——当拖动开始时,后者被击中。但是为什么以及如何阻止这种情况呢?

【问题讨论】:

为什么不在手势识别器动作中进行视图操作?检查recognizer.state == UIGestureRecognizerStateBegan是否设置了大背景+阴影,然后在recognizer.state == UIGestureRecognizerStateEnded或者取消的时候重新设置...(不知道常量是否正确) 我已经在我的dragTile: 方法中尝试过,然后增加瓷砖并显示阴影发生得太晚了:它发生在拖动开始时而不是(之前)用户触摸瓷砖时。这是我在 GitHub 历史中的尝试:github.com/afarber/ios-newbie/blob/… 啊我明白了...然后看看手势识别器的选项cancelsTouchesInView(负责调用您的touchesCancelled 方法) - 如果您禁用它,那么它不应该不再被调用... +1 可行,谢谢!我想知道我是否可以/应该摆脱touchesXXXXXUIGestureRecognizer - 停止混合它们...... 您介意我将其发布为答案吗? - 好吧,只依赖一种解决方案听起来不错,因为平移本身可以很容易地在 touchesMoved 中完成...... 【参考方案1】:

如cmets中所述,解决问题的方法是将UIGestureRecognizercancelsTouchesInView属性设置为NO,这样touchesCancelled:withEvent:方法就不会被识别器调用。

请参阅文档here。

【讨论】:

以上是关于拖动带有阴影的自定义 UIView - 大小重置和阴影消失的主要内容,如果未能解决你的问题,请参考以下文章

在视图大小更改时更改 UIView 阴影大小会产生奇怪的效果

带有圆角和阴影的 UIView?

带有圆角和阴影的 UIView?

带有圆角和阴影的 UIView?

故事板约束不影响自定义 UiView 大小

如何将可拖动的 UIView 限制在特定范围内