我试图拦截在我的整个应用程序中发生的任何活动(即触摸).
换句话说,我正在尝试通知我的主要UIView中发生的任何触摸事件,其中包含我的其余控件.为此,我认为UIView的方法-hitTest:withEvent:是一个很好的解决方案.
但是,当我在调用[super hitTest:... withEvent:...]之前NSLog进入这个重写方法时,我看到它为我所做的任何触摸都被调用了3次,我看不到我收到的事件有什么不同每次被召唤.
以下是如何在我的应用程序的主视图中实现该方法:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSLog(@"hitTest:withEvent called :");
NSLog(@"Event: %@", event);
NSLog(@"Point: %@", NSStringFromCGPoint(point));
NSLog(@"Event Type: %d", event.type);
NSLog(@"Event SubType: %d", event.subtype);
NSLog(@"---");
return [super hitTest:point withEvent:event];
}
Run Code Online (Sandbox Code Playgroud)
这是我在这个视图中单次触摸的NSLog:
2010-11-29 14:09:26.892 Application[68818:207] hitTest:withEvent called :
2010-11-29 14:09:26.892 Application[68818:207] Event: <UITouchesEvent: 0x5716d60> timestamp: 37935.2 touches: {(
)}
2010-11-29 14:09:26.892 Application[68818:207] Point: {173, 498}
2010-11-29 14:09:26.892 Application[68818:207] Event Type: 0
2010-11-29 14:09:26.892 Application[68818:207] Event SubType: 0
2010-11-29 14:09:26.893 Application[68818:207] ---
2010-11-29 14:09:26.893 Application[68818:207] hitTest:withEvent called …
Run Code Online (Sandbox Code Playgroud) 我想允许用户绘制曲线,使得任何线都不能穿过另一条线甚至自身.绘制曲线是没有问题的,我甚至发现我可以通过追踪线的节点向前和向后然后关闭路径来创建一个闭合的路径,并且仍然是线条状的.
不幸的是,iOS只提供了一个测试点是否包含在一个封闭的路径中(containsPoint:和CGPathContainsPoint).不幸的是,用户可以非常容易地移动他们的手指足够快以使触摸点落在现有路径的两侧而实际上不被该路径包含,因此测试触摸点是非常没有意义的.
我找不到任何"路口"的路径方法.
关于如何完成这项任务的任何其他想法?
我有2个滚动视图,两个都应该垂直滚动.外部滚动视图(红色)包含搜索栏和内部滚动视图(蓝色).内部滚动视图应该无限滚动(它包含图像/项目,并具有无限滚动实现).
我希望这个控制器工作的方式如下:
向下滚动时,外部滚动视图应首先滚动,搜索栏应消失(滚出内容区域).只有在那之后,内部滚动视图才应该开始滚动.向上滚动时,内部滚动视图应一直滚动到顶部.只有这样外部滚动视图才能进行滚动事件,最后向上滚动以使搜索栏再次可见.
如果我只是在没有任何修改的情况下将它们嵌套在IB中,那么内部滚动视图会捕获所有滚动事件,而它会以相反的方式工作.
请记住,我在这里使用内部滚动视图作为简化的比喻.在我的应用程序中,我实际上有一个控件,它有一个带嵌套表视图的滚动视图(滚动视图让我水平页面,表视图让我垂直滚动).
我有2个视图,但我想让1个视图(虚拟)更大.如果我将tapGesture放在v1上,则点击手势可以使用更大的命中区域但是如果我将我的tapGesture放在v2上则不起作用(实际上它根本不识别tapGesture,甚至不能识别原始边界内)甚至虽然我循环我的TestView1 hittest方法,点包含在框架中.
#import "ViewController.h"
@interface TestView1 : UIView
@end
@implementation TestView1
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
CGFloat radius = 100.0;
CGRect frame = CGRectMake(0, 0,
self.frame.size.width + radius,
self.frame.size.height + radius);
if (CGRectContainsPoint(frame, point)) {
return self;
}
return nil;
}
@end
@interface TestView2 : UIView
@end
@implementation TestView2
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
CGFloat radius = 100.0;
CGRect frame = CGRectMake(0, 0,
self.frame.size.width + radius,
self.frame.size.height + radius);
if (CGRectContainsPoint(frame, point)) {
return self;
}
return nil; …
Run Code Online (Sandbox Code Playgroud) 我有一条在边框内的消息,显示在MDI客户区前面.因为它只是一条消息,所以我将其设置IsHitTestVisible
为false.为方便起见,我还在其中包含了一个按钮,因此用户只需单击按钮即可开始新图表.
但是,由于边框IsHitTestVisible
设置为False
,它True
会使按钮的值短路,因此用户无法单击按钮.
也就是说,如何让一个控件对鼠标不可见,同时仍允许其中一个孩子接收鼠标事件?
这是一个截图:
我们希望带有文本的蓝色区域被点击测试不可见,但我们希望按钮仍然可以被按下.思考?(是的,我已经知道将这两个项目堆叠在一个网格中,但这与布局有关.
编辑
有关最新项目,请参阅Nathan的评论部分.只剩下问题:获得正确的按钮.
编辑
我想要一个用户可以旋转的UIView.UIView应包含一些可以单击的UIButton.我很难,因为我使用UIControl子类来制作旋转视图,在该子类中,我必须禁用UIControl中子视图的用户交互(使其旋转),这可能导致UIButton无法点击.如何创建用户可以旋转并包含可点击的UIButton 的UIView ?这是我项目的链接,它为您提供了一个良好的开端:它包含UIButtons和可旋转的UIView.但是我可以不点击UIButtons.
老问题有更多细节
我正在使用这个pod:https://github.com/joshdhenry/SpinWheelControl,我想对按钮点击做出反应.我可以添加按钮,但是我无法在按钮中接收点击事件.我正在使用hitTests,但它们永远不会被执行.用户应旋转滚轮,并能够单击其中一个饼图中的按钮.
在这里获取项目:https://github.com/Jasperav/SpinningWheelWithTappableButtons
请参阅下面的代码我在pod文件中添加的内容:
我在SpinWheelWedge.swift中添加了这个变量:
let button = SpinWheelWedgeButton()
Run Code Online (Sandbox Code Playgroud)
我添加了这个类:
class SpinWheelWedgeButton: TornadoButton {
public func configureWedgeButton(index: UInt, width: CGFloat, position: CGPoint, radiansPerWedge: Radians) {
self.frame = CGRect(x: 0, y: 0, width: width, height: 30)
self.layer.anchorPoint = CGPoint(x: 1.1, y: 0.5)
self.layer.position = position
self.transform = CGAffineTransform(rotationAngle: radiansPerWedge * CGFloat(index) + CGFloat.pi + (radiansPerWedge / 2))
self.backgroundColor = .green
self.addTarget(self, action: #selector(pressed(_:)), for: …
Run Code Online (Sandbox Code Playgroud) 在使用VisualTreeHelper.HitTest
甚至隐藏元素的WPF 中找到.要跳过这些元素并仅返回可见的结果,我创建了HitTestFilter
如下内容:
///This Filter should cut all invisible or not HitTest Enabled Elements
private static HitTestFilterBehavior MyHitTestFilter(DependencyObject target)
{
var uiElement = target as UIElement;
if (uiElement != null){
if(!uiElement.IsHitTestVisible || !uiElement.IsVisible))
return HitTestFilterBehavior.ContinueSkipSelfAndChildren;
}
return HitTestFilterBehavior.Continue;
}
Run Code Online (Sandbox Code Playgroud)
这个过滤器完成了他的工作,但我想知道默认的WPF HitTesting在这种情况下做了什么?它是否使用类似的过滤器?这样做还有其他更好的选择吗?
澄清一个简短的描述:
在图像中有
如果我有这样的布局并在Button2的绿色区域中执行鼠标点击,WPF会跳过Button2并且Button1上会出现click事件.
如果我在没有前面描述的过滤器的情况下进行手动HitTesting,我将得到Button2作为结果.
所以问题是,WPF使用的默认行为/过滤器是什么?
在此先感谢您的任何建议.
我是iOS中的SceneKit和3D空间的新手.我目前正在制作一个简单的游戏,显示一个包含28个段的立方体(如果你想要的话,可以使用"迷你立方体").
我想通过点击它们来移动迷你立方体,但我无法理解如何选择特定节点(大立方体的子节点).
任何人都可以帮我或发布一个关于傻瓜的SceneKit教程的链接?我一直在寻找几天,并没有找到我正在寻找的东西.
干杯
我是新手,目前正在构建一个与 AR 相关的应用程序,在旧版本上我说了这个
let results = self.hitTest(screenPosition, types: [.featurePoint])
Run Code Online (Sandbox Code Playgroud)
现在我遇到了一个问题,即在 iOS 14.0 中不推荐使用 hitTest
hitTest(_:types:)' was deprecated in iOS 14.0: Use [ARSCNView raycastQueryFromPoint:allowingTarget:alignment]
Run Code Online (Sandbox Code Playgroud)
请告诉我如何解决它,谢谢:)
hittest ×10
ios ×6
swift ×3
iphone ×2
wpf ×2
.net ×1
arscnview ×1
c# ×1
cocoa-touch ×1
drag ×1
events ×1
flutter ×1
layout ×1
nested ×1
objective-c ×1
raycasting ×1
scenekit ×1
swipe ×1
tap ×1
touchesbegan ×1
uibezierpath ×1
uicontrol ×1
uiscrollview ×1
uiview ×1