拖动带有阴影的自定义 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];
我的问题是:
当我触摸一个图块时,它的大小会增加并显示阴影(这没关系)。
但是一旦我开始拖动图块,它的大小就会重置为小而没有阴影(我不明白)。
我在touchesEnded
和touchesCancelled
设置了断点——当拖动开始时,后者被击中。但是为什么以及如何阻止这种情况呢?
【问题讨论】:
为什么不在手势识别器动作中进行视图操作?检查recognizer.state == UIGestureRecognizerStateBegan
是否设置了大背景+阴影,然后在recognizer.state == UIGestureRecognizerStateEnded
或者取消的时候重新设置...(不知道常量是否正确)
我已经在我的dragTile:
方法中尝试过,然后增加瓷砖并显示阴影发生得太晚了:它发生在拖动开始时而不是(之前)用户触摸瓷砖时。这是我在 GitHub 历史中的尝试:github.com/afarber/ios-newbie/blob/…
啊我明白了...然后看看手势识别器的选项cancelsTouchesInView
(负责调用您的touchesCancelled
方法) - 如果您禁用它,那么它不应该不再被调用...
+1 可行,谢谢!我想知道我是否可以/应该摆脱touchesXXXXX
或UIGestureRecognizer
- 停止混合它们......
您介意我将其发布为答案吗? - 好吧,只依赖一种解决方案听起来不错,因为平移本身可以很容易地在 touchesMoved 中完成......
【参考方案1】:
如cmets中所述,解决问题的方法是将UIGestureRecognizer
的cancelsTouchesInView
属性设置为NO
,这样touchesCancelled:withEvent:
方法就不会被识别器调用。
请参阅文档here。
【讨论】:
以上是关于拖动带有阴影的自定义 UIView - 大小重置和阴影消失的主要内容,如果未能解决你的问题,请参考以下文章