UIView iOS 9中的碰撞边界路径起源

时间:2016-03-10 01:16:38

标签: ios objective-c svg uikit uibezierpath

我正在尝试设置自定义UIView的collison边界路径。我目前所做的是使用PocketSVG将SVG文件转换为路径并从中创建UIBezierPath。这是我的代码:

@implementation CustomView {

    UIBezierPath * _mask;
    CGPathRef _myPath;

}

- (UIDynamicItemCollisionBoundsType) collisionBoundsType {

    return UIDynamicItemCollisionBoundsTypePath;

}

- (UIBezierPath *) collisionBoundingPath {

    _myPath = [PocketSVG pathFromSVGFileNamed:@"line5"];

    _mask = [UIBezierPath bezierPathWithCGPath:_myPath];

    return _mask;

}

它“正确”工作但是UIBezierPath是在我的视图中心绘制的,所以这就是我得到的:

左:实际行为---> 右:预期行为

enter image description here

由于碰撞边界是不可见的,碰撞似乎在视觉上触摸视图之前发生(它们实际上是因为碰撞边界路径的原点而触碰)。

根据Apple documentation regarding collisionBoundingPath

  

您创建的路径对象必须表示凸多边形   逆时针或顺时针缠绕,路径不得   相交自己。路径的(0,0)点必须位于   相应动态项的中心点。如果中心点   与路径的原点不匹配,碰撞行为可能无效   预期

所以我的主要问题是,由于路径的(0,0)坐标必须位于我视图的中心,我如何才能实现我正在寻找的东西?完美的场景是如果UIBezierPath开始绘制其UIView的原点,但由于我从SVG添加路径,它会自动从视图的中心绘制。

1 个答案:

答案 0 :(得分:1)

您可以使用转换将CGPath移动到适当的位置。例如:

- (UIBezierPath *) collisionBoundingPath {

    _myPath = [PocketSVG pathFromSVGFileNamed:@"line5"];

    CGAffineTransform translation = CGAffineTransformMakeTranslation(-self.bounds.size.width * 0.5,-self.bounds.size.height * 0.5);
    CGPathRef movedPath = CGPathCreateCopyByTransformingPath(_myPath,&translation);

    _mask = [UIBezierPath bezierPathWithCGPath:movedPath];

    return _mask;

}