有没有办法获得触发UIEvent的触摸手势?所以,假设我用hitTest拦截了一个手势:withEvent:.如何识别触发此方法的触摸(捏,敲击,滑动等)?
我可以从UIEvent子类型获得远程事件的类型,即使设备被动摇,但触摸事件没有参数......
你如何识别这些?
我有Ellipse一个Canvas,我正在做它的命中测试.每次我点击它的笔划Ellipse,测试都会通过.如果我点击中间Ellipse,测试失败.这很好!
在我填充这样的椭圆之后:myEllipse.Fill = new SolidColorBrush(Colors.Blue);,当我点击中间时,测试pasess Ellipse.
我怎么能禁用它?(即使Ellipse填写时,我点击中间时测试也会失败)谢谢!
我想在WPF Canvas组件上执行rectangual命中测试,以获得与Rectangle框架元素重叠的控件.我找到了一个Silverlight的VisualTreeHelper.FindElementsInHostCoordinates方法,但显然它在WPF中不可用.
实现此类功能的最佳方法是什么?
好的,所以我之前的问题没有产生任何有用的答案,所以我会尝试从不同的方向来.
我的应用程序可能有几个窗口.给定屏幕坐标中的一个点,我需要找到它"落入"哪个窗口 - 即找到包含所述点的所有窗口中最重要的窗口.
如果他们Visual在一个窗口内,我会用VisualTreeHelper.HitTest.但由于它们是不同的窗口,因此不清楚该方法的第一个参数是什么.
我正在尝试修复一个涉及UIView hitTest的错误:withEvent:当触摸在UIKeyboard上时,在我的视图上调用,但只有在应用程序处于后台之后.
它发生在我的应用程序中,具有复杂的视图层次结构,所以我在一个只有2个视图的应用程序中重现它:
行为如下:
我在iOS 5 iPad上看到这个2.但是只能在设备上,而不是在模拟器中.知道为什么hitTesting会以这种方式搞砸了吗?谢谢.
当兄弟姐妹重叠时,错误 - 命中测试无法正常工作:
场景中有2个重叠节点具有相同的父节点(即兄弟节点)
最顶层的节点具有
userInteractionEnabled = NO另一个节点userInteractionEnabled = YES.如果触摸了重叠,则在最顶层节点被命中测试并且失败(因为
userInteractionEnabled = NO)之后,而不是底部节点是下一个被命中测试的节点,它被跳过并且2个兄弟节点的父节点被命中测试.应该发生的是,下一个兄弟(底部节点)是经过重击测试而不是命中测试跳到父节点.
根据Sprite Kit文档:
"在场景中,当Sprite Kit处理触摸或鼠标事件时,它会遍历场景以找到想要接受事件的最近节点.如果该节点不想要事件,Sprite Kit会检查下一个最近的节点,所以处理命中测试的顺序基本上与绘制顺序相反.对于在命中测试期间要考虑的节点,其userInteractionEnabled属性必须设置为YES.除场景外的任何节点的默认值为NO节点."
这是一个错误,因为节点的兄弟姐妹在他们的父母之前呈现 - 兄弟姐妹应该是下一个被测试的,而不是它的父母.此外,如果一个节点有userInteractionEnabled = NO,那么肯定它应该是'透明'的关于命中测试 - 但是这不是因为它导致行为的改变,因为在测试中跳过了一个节点.
我在网上搜索过,但找不到任何人报告或发布此错误.我应该报告这个吗?
然后我在这里发布这个的原因是因为我想要一个关于这个bug的'修复'的建议(即建议在某处实现某些代码,以便SpriteKit以'预期'方式工作-testing)
复制错误:
使用在Xcode中启动新的"游戏"项目时提供的"Hello World"模板(它具有"Hello World"并在您单击时添加火箭精灵).
可选:[我还从项目中删除了火箭精灵图像,因为
X当找不到图像时出现的矩形更容易用于调试,可视化]将SKSpriteNode添加到场景中
userInteractionEnabled = YES(我将从现在开始将其称为节点A).运行代码.
您会注意到,当您单击节点A时,不会生成火箭精灵.(自命中测试成功后应该停止的预期行为 - 它在节点A上成功时停止)
但是,如果你在节点A旁边产生一些火箭,然后点击节点A和火箭重叠的地方,那么就有可能在节点A上产生另一个火箭 - 但这不可能.这意味着在最顶层节点(
userInteractionEnabled = NO默认情况下为火箭)上的命中测试失败后,它不再测试下一个节点A,而是测试火箭的父节点,而不是场景.
注意:我使用的是Xcode 7.3.1,Swift,iOS - 我还没有测试过这个bug是否具有通用性.
额外的细节:我做了一些额外的调试(上面的复制有轻微的复杂性),并确定命中测试后来发送给父母,因此不一定是场景.
我正在尝试使用客户端JavaScript实现SVG文本元素的冲突检测.命中测试应检查文本的任何字形是否与另一个文本元素的任何字形重叠.由于getBBox并且getExtentOfChar不是准确的,我需要一个自定义的解决方案.
我的第一种方法是获取元素的每个坐标/像素的颜色并手动进行命中测试,但这不起作用,因为无法获得坐标的颜色.它需要一个额外的画布来获得像素颜色 - >糟糕的解决方法.
现在我正在考虑将文本或字形转换为多边形以进行命中测试.可能吗?或者还有其他任何基于字形的命中测试的方法吗?
最好的祝福
我有一个DrawingVisual该rappresents其几何形状由这个描述的路径元素的语法:
"m106,59.3c0-1.98,0,0-4.95,0.989-3.96,0.989-13.8,3.96-20.8,4.95-6.92,0-14.8-3.96-17.8-3.96-1.98,2.97,3.96,10.9,7.91, 13.8,2.97,1.98,9.89,3.96,14.8,3.96,4.95-0.989,10.9-2.97,13.8-6.92,2.97-2.97,5.93-10.9,6.92-12.9z"
为了呈现视觉效果我使用MyCanvas类,它提供了命中测试功能:
public class MyCanvas : Panel
{
public List<Visual> Visuals = new List<Visual>();
private List<DrawingVisual> Hits = new List<DrawingVisual>();
public void AddVisual(Visual Visual)
{
this.Visuals.Add(Visual);
base.AddVisualChild(Visual);
base.AddLogicalChild(Visual);
}
public List<DrawingVisual> GetVisuals(Geometry Region)
{
GeometryHitTestParameters Parameters = new GeometryHitTestParameters(Region);
this.Hits.Clear();
HitTestResultCallback Callback = new HitTestResultCallback(this.HitTestCallBack);
VisualTreeHelper.HitTest(this, null, Callback, Parameters);
return this.Hits;
}
private HitTestResultBehavior HitTestCallBack(HitTestResult Result)
{
GeometryHitTestResult GeometryRes = (GeometryHitTestResult)Result;
DrawingVisual DVisual = Result.VisualHit as DrawingVisual;
if (DVisual != null && GeometryRes.IntersectionDetail == …Run Code Online (Sandbox Code Playgroud) 无法找到解决方案.
我正在构建一个具有大滚动视图的应用程序,具有分页(水平).在这个滚动视图中,有一个UIView网格,每个网格中都有一个UIScrollview,有垂直滚动视图.
现在,关键是,当我分页我的'大'滚动视图时,有时触摸会卡在网格的UIViews中的一个小滚动视图中.
我不知道如何避免它 - 尝试使用hitTest但仍然无法找到答案.
希望我很清楚......
谢谢你的帮助.
编辑:
这是更大的scrollview:
@implementation UIGridScrollView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
self.pagingEnabled;
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
现在,对于这个UIGridScroll View,我添加了一个子视图这个视图:
@implementation UINoteView
{
IBOutlet UIScrollView *_innerScrollView; // this scrollview frame is in the size of the all UINoteView
}
- (void)awakeFromNib
{
_innerScrollView.contentSize = CGSizeMake(_innerScrollView.frame.size.width, _innerScrollView.frame.size.height+50.0f);
}
@end
Run Code Online (Sandbox Code Playgroud)
分页效果很好,内部滚动视图效果很好,但是当我分页较大的音符视图时,我的手指"卡在"_innerScrollView中的次数太多了.
谢谢!
我有一个UIControl包含一些其他控件的自定义.在这些控件之间有空的空间和我UIControl需要透明的背景.
我需要捕捉我的自定义上发生的所有触摸事件,UIControl即使它们恰好发生在其他控件之间(透明区域).我不能使用手势识别器,我需要更多的控制然后他们提供.相反,我想注册触摸处理功能,如下所示:
myControl.addTarget(self, action: "handleTouchDown:event:", forControlEvents: UIControlEvents.TouchDown)
Run Code Online (Sandbox Code Playgroud)
有了这种方法,我会收到与非透明区域相关的触摸,myControl而不是那些发生透明背景的区域.
我尝试覆盖hitTest::point:withEvent我的自定义控件,不检查alpha值.但是hitTest::point:withEvent当触摸发生在透明控制区域时,甚至都没有调用.我用layer自定义替换了我的控件,CALayer并且hitTest在没有结果的情况下覆盖了它(hitTest在该层上似乎根本没有被调用).
为了提供一个完美的答案(并赢得赏金),您需要做的就是:
UIControl(例如UIButton).UIControl(文本UIButton)中删除所有内容并使其背景透明(设置为清除颜色或将Alpha通道设置为0).addTarget::action:forControlEvents:方法注册UIControlEvents.TouchDown控件上的事件.在handler方法中打印一些东西到控制台.addTarget::action:forControlEvents:.没有黑客解决方案.我知道在控件上设置背景alpha通道0.01会使它突然工作,但这是我不想要的黑客攻击.在这里描述你做了什么.hittest ×10
ios ×4
wpf ×4
.net ×2
c# ×2
cocoa-touch ×1
drawing ×1
graphics ×1
html5 ×1
ios5 ×1
iphone ×1
javascript ×1
objective-c ×1
silverlight ×1
sknode ×1
sprite-kit ×1
svg ×1
swift ×1
touch ×1
uicontrol ×1
uievent ×1
uiscrollview ×1
uiview ×1