我不想要UIButton或类似的东西.我想UIControl直接子类化并制作我自己的非常特殊的控件.
但由于某种原因,我所覆盖的任何方法都没有被调用过.目标动作的东西起作用,目标接收适当的动作消息.但是,在我的UIControl子类中,我必须捕获触摸坐标,这样做的唯一方法似乎是覆盖这些人:
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
NSLog(@"begin touch track");
return YES;
}
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
NSLog(@"continue touch track");
return YES;
}
Run Code Online (Sandbox Code Playgroud)
它们永远不会被调用,即使它UIControl是使用指定的初始化程序实例化的UIView,initWithFrame:.
我可以找到的所有示例总是使用UIButton或UISlider作为子类的基础,但我想更接近,UIControl因为这是我想要的源:快速和未延迟的触摸坐标.
我想问一下如何在UICollectionView中实现UITableView滑动删除的相同行为.我试图找到一个教程,但我找不到任何.
另外,我使用PSTCollectionView包装器来支持iOS 5.
谢谢!
编辑:滑动识别器已经很好了.我现在需要的是取消删除模式时与UITableView相同的功能,例如当用户点击单元格或表格视图中的空白区域时(即,当用户点击删除按钮之外时).UITapGestureRecognizer不起作用,因为它只检测触摸释放时的点击.UITableView在手势开始时(而不是在释放时)检测到触摸,并立即取消删除模式.
我想要的是一个UISlider让用户不仅可以在他开始时滑动thumbRect,而且还可以在其他地方点击的时候滑动.当用户点击滑块但在滑块之外时thumbRect,滑块应跳转到该值,然后仍然保持用户的滑动手势.
到目前为止我尝试过的是在这个建议中实现UIGestureRecognizer的子类.当它thumbRect发生在外面某处的触地时,它就开始了.问题是滑块设置其值但随后进一步滑动手势被忽略,因为触摸识别器已经窃取了触摸.
如何实现滑块,您可以在任何地方点按但仍然可以立即滑动?
编辑:ali59a非常友好地添加了我现在所做的一个例子.这需要再次抬起手指,之后我可以触摸并拖动滑动(水龙头不是我想要的,我需要立即'触摸和滑动').
我试图检测手指何时第一次接触 SwiftUI 中的视图。我可以用 UIKit Events 很容易地做到这一点,但在 SwiftUI 中无法解决这个问题。
我已经尝试了最小移动为 0 的 DragGesture,但在您的手指移动之前它仍然不会改变。
TapGesture 仅在您抬起手指时才起作用,并且无论我将参数设置为什么,LongPressGesture 都不会足够快地触发。
DragGesture(minimumDistance: 0, coordinateSpace: .local).onChanged({ _ in print("down")})
LongPressGesture(minimumDuration: 0.01, maximumDistance: 100).onEnded({_ in print("down")})
Run Code Online (Sandbox Code Playgroud)
我想在手指与视图接触后立即检测 touchDown 事件。Apple 的默认手势对距离或时间都有限制。
更新:这不再是问题,因为 Apple 似乎更新了 DragGesture 的工作方式,或者我可能遇到了特定的上下文错误。
如何在touchmoved功能中获得手指移动的速度和方向?
我想获得手指速度和手指方向,并将其应用于UIView类方向移动和动画速度.
我读了这个链接,但我无法理解答案,此外它并没有解释我如何检测方向:
到目前为止,我尝试了这段代码:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *anyTouch = [touches anyObject];
CGPoint touchLocation = [anyTouch locationInView:self.view];
//NSLog(@"touch %f", touchLocation.x);
player.center = touchLocation;
[player setNeedsDisplay];
self.previousTimestamp = event.timestamp;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self.view];
CGPoint prevLocation = [touch previousLocationInView:self.view];
CGFloat distanceFromPrevious = [self distanceBetweenPoints:location :prevLocation];
NSTimeInterval timeSincePrevious = event.timestamp - previousTimestamp;
NSLog(@"diff time %f", timeSincePrevious);
}
Run Code Online (Sandbox Code Playgroud) 我正在制作一个自定义键盘,我的处境非常奇怪.
我注意到当我在UIView(inputView)的左后方(大约20个像素)处捕获事件touchesBegan时,我会在这里有一些延迟.我在touchesBegan中所做的任何动作都会比其他区域执行得慢.
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
self.keypop.hidden = false
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
{
self.keypop.hidden = true
}
Run Code Online (Sandbox Code Playgroud)
这个问题会影响我的应用程序的性能.在这个例子中,当我触摸左后方时,我不会看到keypop出现因为self.keypop.hidden显示延迟了.
我不知道为什么,或者这是iOS 9的错误?我一直坚持这个麻烦一个星期.
默认情况下,在UITableView上,当您触摸单元格时,它将进入选定模式,并以灰色突出显示.
在我们的应用程序中,您可以触摸标题,然后转到另一个页面.
我们希望用户在触摸某个部分时获得相同类型的视觉反馈,就像他们触摸一个单元格时一样.也就是说,它通过进入"选定"模式并使背景变得更暗来指示选择来响应.
触摸UITableView部分时不会发生这种情况.该部分不进入选择模式.它不会变灰.
我们尝试过一个透明按钮,它跨越了一个带有背景图像的自定义UIView,并启用了"逆转突出显示",但结果不是非常敏感而且很糟糕.
实现此类功能的最佳策略是什么?
ios ×6
objective-c ×2
swift ×2
uitableview ×2
delay ×1
gesture ×1
iphone ×1
swiftui ×1
touchesbegan ×1
uicontrol ×1
uislider ×1
uitouch ×1