我正在尝试设置自定义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是在我的视图中心绘制的,所以这就是我得到的:
左:实际行为---> 右:预期行为
由于碰撞边界是不可见的,碰撞似乎在视觉上触摸视图之前发生(它们实际上是因为碰撞边界路径的原点而触碰)。
根据Apple documentation regarding collisionBoundingPath:
您创建的路径对象必须表示凸多边形 逆时针或顺时针缠绕,路径不得 相交自己。路径的(0,0)点必须位于 相应动态项的中心点。如果中心点 与路径的原点不匹配,碰撞行为可能无效 预期
所以我的主要问题是,由于路径的(0,0)坐标必须位于我视图的中心,我如何才能实现我正在寻找的东西?完美的场景是如果UIBezierPath开始绘制其UIView的原点,但由于我从SVG添加路径,它会自动从视图的中心绘制。
答案 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;
}