Ios 带有UIAttachmentBehavior的平移手势不适用于子视图
我有一个具有以下层次结构的视图:Ios 带有UIAttachmentBehavior的平移手势不适用于子视图,ios,objective-c,uikit-dynamics,Ios,Objective C,Uikit Dynamics,我有一个具有以下层次结构的视图: self.view (with animator) |-> self.view (centered) |-> (view with gravity+push+dynamic+collision+(attachment disabled) behaviors) |-> (view with gravity+push+dynamic+collision+(attachment disabled) behaviors
self.view (with animator)
|-> self.view (centered)
|-> (view with gravity+push+dynamic+collision+(attachment disabled) behaviors)
|-> (view with gravity+push+dynamic+collision+(attachment disabled) behaviors)
|-> (view with gravity+push+dynamic+collision+(attachment disabled) behaviors)
|-> (view with gravity+push+dynamic+collision+(attachment disabled) behaviors)
当手势识别器开始时,我检测视图并保留附件,并根据识别器开始状态下的原始视图中心设置其定位点。如果动画师之间没有任何中间视图,则此操作可以正常工作,但是如果有,则拖动手势不会正确映射到其位置
处理这一切的代码如下:
@IBAction private func handlePanGesture(recognizer: UIPanGestureRecognizer)
{
let translationPoint:CGPoint = recognizer.translationInView(self.containerView);
let point:CGPoint = recognizer.locationInView(self.containerView);
if recognizer.state == UIGestureRecognizerState.Began
{
let attachment:UIAttachmentBehavior?;
let index:Int = self.viewIndexFromPoint(point);
if (index >= 0)
{
attachment = self.attachmentBehaviors[index];
let view:RoundView = self.buttons[index];
self.currentAttachmentBehavior = attachment;
let anchor:CGPoint = CGPointMake(view.center.x + translationPoint.x, view.center.y + translationPoint.y);
attachment?.anchorPoint = anchor;
view.panGestureStartPoint = anchor;
self.animator?.addBehavior(attachment!);
print("added Attachment \(attachment)");
}
else
{
attachment = nil;
}
}
else if ((recognizer.state == UIGestureRecognizerState.Ended ||
recognizer.state == UIGestureRecognizerState.Cancelled ||
recognizer.state == UIGestureRecognizerState.Failed) && self.currentAttachmentBehavior != nil)
{
self.animator?.removeBehavior(self.currentAttachmentBehavior!);
}
else
{
if let attachment:UIAttachmentBehavior = self.currentAttachmentBehavior
{
let index:Int = self.attachmentBehaviors.indexOf(attachment)!;
let view:RoundView = self.buttons[index];
let anchor:CGPoint = CGPointMake(view.panGestureStartPoint!.x + translationPoint.x, view.panGestureStartPoint!.y + translationPoint.y);
attachment.anchorPoint = anchor;
}
}
}
我有几个问题:
-容器视图始终位于我的动画按钮前面。没有与此视图关联的行为,为什么会发生这种情况,这是由与containerView superview关联的动画师造成的吗?如果需要容器视图将UI元素定位在屏幕中央,如何解决这个问题?
-附件行为无法正常工作,因为它会导致视图像钟摆一样摆动,并具有较大的偏移裕度
任何帮助都将不胜感激
谢谢我会在另一个视图上创建另一个视图,仅用于用户交互。然后它将始终在前面并接收触摸事件。对不起,你的意思是什么?根据你对问题的描述,你的一个观点似乎正在拦截触摸事件。这可以通过禁用视图中通过view.userInteractionEnabled=false截取的触摸事件来解决,或者将一个仅用于接收触摸事件的视图放置在障碍视图的顶部。