我有一个UIImage
视图响应触摸事件.touchesMoved:
如果触摸超出某些范围,我想取消触摸序列,即进一步调用.我怎样才能做到这一点?
我知道在touchesMoved:
我可以检查触摸物体的坐标并忽略它,但我不知道的是如何完全取消序列.我没有看到Apple Developer UIResponder
Reference中记录的任何方法,我可以调用它来取消触摸序列.
我正在开发一款iPhone游戏,其代码我从其他开发者那里继承而来.游戏网格是具有1000x1000的contentSize的UIScrollView.网格包含通过OpenGL的Texture2D类在屏幕上绘制的几个元素.
UIScrollView的滚动方向与手指移动的方向相反.这背后的想法是模拟用手指"筛选"元素的行为,因为触摸路径中的每个元素都应该受到影响/操纵.
问题是UIScrollView的滚动会触发touchesCancelled,从而结束游戏依赖的touchesMoved调用,以了解要操作的元素.即使我的手指移动没有在视觉上触发视图滚动,移动我的手指超过10个像素的距离触发touchesCancelled方法,从而结束未来touchesMoved调用,直到我抬起手指并开始新的触摸事件.
我确信这是触发touchesCancelled方法的滚动事件,因为如果我self.scrollingEnabled = NO;
在视图上设置,在屏幕上移动手指会继续触发touchesMoved,因为无论我在屏幕上移动手指多远,触摸都会获得当我抬起手指时(在我完成对元素的筛选之后)按预期调用,并且我的触摸/滑动路径中的每个元素确实按照需要进行操作.但是,设置此属性自然会阻止所需的游戏网格滚动.
我已尝试设置视图self.canCancelContentTouches = NO;
的initWithFrame
方法,但touchesCancelled
仍然被触发,奇怪的是.不知道为什么会这样!也许我已经把它放在错误的位置,但我不太确定这甚至可以解决我的问题,因为文档暗示这样的设置会阻止滚动:"如果这个属性的值为NO,一旦内容视图开始跟踪,无论手指移动,滚动视图都不会滚动." 很明显,这不是我追求的行为,所以财产似乎并不是我感兴趣的东西.虽然我仍然感到困惑,为什么它仍然滚动和调用touchesCancelled
,但我离题了.
我还添加了方法,- (BOOL)touchesShouldCancelInContentView:(UIView *)view
但它没有被调用,即使没有设置,self.canCancelContentTouches = NO;
因为文档说将canCancelTouches属性设置为NO确实会阻止调用touchesShouldCancelInContentView方法:"滚动视图不会调用此方法,如果值为canCancelContentTouches属性为NO." .虽然文档似乎不清楚是否从这种方法返回NO也会阻止滚动像canCancelContentTouches = NO;
设置那样.如果没有,那么这应该是理想的解决方案.虽然,我不知道为什么这个方法甚至没有被调用,因为文档只提到一个属性/设置阻止它被调用,并且即使该属性未设置为NO仍然没有被调用(因此默认为YES).
所以现在我不知所措.事实是我仍然需要touchesMoved才能在视图开始滚动后继续调用.那可能吗?如果没有,我有什么选择?
我有一个子类UIView
上的顶部UITableView
.我正在使用它UITableView
来显示一些数据,同时,我想覆盖手指后面的动画(例如,留下一条线索).
如果我是正确的,我需要的触摸事件要处理两个由UIView
子和UITableView
.我怎样才能做到这一点?是否可以touchesMoved
在UIView子类上触发,然后再触发UITableView
?
非常感谢你的帮助.
所以我有一个UIView的子类,假设检测触摸.仅当触摸在当前视图内开始时,视图检测才会触摸.当触摸从视图外部开始并且它们在我的自定义视图中移动时,touchesMoved不会被调用.任何解决方案都可以检测当前视图中尚未启动的移动触摸?
@implementation MycustomView
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// This only gets called if touches have started in the current View
}
@end
Run Code Online (Sandbox Code Playgroud) 如果之前有人玩过Agar.io,你可能会熟悉相机移动的方式.它会滑向鼠标,具体取决于鼠标距离屏幕中心的距离.我正在尝试使用SKCameraNode和touchesMoved重新创建此运动:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos = touches.first!.location(in: view)
let center = view!.center
let xDist = pos.x - center.x
let yDist = pos.y - center.y
let distance = sqrt((xDist * xDist) + (yDist * yDist)) * 0.02
camera?.position.x += xDist * distance * 0.02
camera?.position.y -= yDist * distance * 0.02
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,这看起来并不太糟糕.但是,这有两个问题.
首先,我想为此使用UIPanGestureRecognizer,因为它可以通过多次触摸更好地工作.我无法想象如何做到这一点,因为我无法想到一种方法来使用它来获得从触摸到屏幕中心的距离.
第二个问题是这种运动并不顺利.如果用户停止移动他们的手指一帧,那么由于相机拍摄到绝对停止,因此会有巨大的跳跃.我在数学方面很糟糕,所以我想不出一种方法来实现一个很好的平滑衰减(或攻击).
任何帮助都会很棒!
编辑:我现在这样做:
private var difference = CGVector()
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos …
Run Code Online (Sandbox Code Playgroud) 我想沿着touchesmoved中收集的点在sprite kit中画一条线.
什么是最有效的方式?我已经尝试了几次,我的线在y轴上是错误的,或者占用了很多处理能力,fps下降到10秒.
有任何想法吗?
我有一个自定义UIButton,我已经在自定义按钮类中实现了触摸委托.
在iPhone 6 Plus之前,每件事情都很好.它上面的所有设备如iPhone 6s和7都会产生问题.
当我点击一个按钮touchesBegan
被按预期调用,但touchesMoved
也被调用,它在我的代码中产生问题.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
_firstTouch = [[touches anyObject]locationInView:self];
_isTapped = YES;
[self.nextResponder.nextResponder touchesBegan:touches withEvent:event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
_isTapped = NO;
[self.nextResponder.nextResponder touchesMoved:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
if (_isTapped){
//Functionality
}
Run Code Online (Sandbox Code Playgroud)
为什么要touchesMoved
调用这些设备,我该如何解决?
我收到的那一刻touchesBegan
,我想要removeFromSuperview
触摸的视图和addSuperview
新的父视图,然后继续接受触摸.但是我发现有时这不起作用.具体来说,touchesMoved
并touchesEnded
永远不会被调用.
有没有让这项工作正确的技巧?这用于实现拖放行为,其中视图最初位于滚动视图内.
谢谢.
我正在使用Swift 3.0,SpriteKit和Xcode 8.2.1,在运行iOS 10.2的iPhone 6上进行测试.
问题很简单......表面上看.基本上我的TouchesMoved()以非常不稳定的速率更新,并且正在破坏游戏中UI的基本部分.有时候它完美地工作,一分钟后它以一半的速率进行更新.
我已经解决了这个问题.只是在具有物理体的场景中有一个SKSpriteNode会导致问题......这是我的GameScene代码:
import SpriteKit
import Darwin
import Foundation
var spaceShip = SKTexture(imageNamed: "Spaceship")
class GameScene: SKScene{
var square = SKSpriteNode(color: UIColor.black, size: CGSize(width: 100,height: 100))
override func didMove(to view: SKView) {
backgroundColor = SKColor.white
self.addChild(square)
//This is what causes the problem:
var circleNode = SKSpriteNode(texture: spaceShip, color: UIColor.clear, size: CGSize(width: 100, height: 100))
circleNode.physicsBody = SKPhysicsBody(circleOfRadius: circleNode.size.width/2)
self.addChild(circleNode)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches{
var positionInScreen = …
Run Code Online (Sandbox Code Playgroud) 我有一个scrollview,每3秒自动前进到下一个"页面"(也使用页面控件).但是,一旦用户触摸滚动视图,我想停止自动前进.
我已经将scrollview子类化了.我可以在子类中检测touchesBegan,但是没有调用touchesMoved,所以我无法判断用户是否手动刷过了scrollview.我不能使用scrollviewDidScroll,因为当我在自动前进计时器触发时设置contentOffset时会调用它.
那么我检测触摸的其他选择是什么?为什么不在scrollview子类上调用touchesMoved?
touchesmoved ×10
ios ×8
touchesbegan ×3
uiscrollview ×3
iphone ×2
objective-c ×2
sprite-kit ×2
swift ×2
uiview ×2
cocoa-touch ×1
ios7 ×1
skcameranode ×1
touch ×1
touch-event ×1
uievent ×1
uiresponder ×1
uitouch ×1