UIView 中的碰撞边界路径原点 iOS 9
Collision bounding path origin in UIView iOS 9
我正在尝试设置自定义 UIView 的碰撞边界路径。我目前所做的是使用 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;
}
它有效 "correctly" 但 UIBezierPath 绘制在我视图的中心,所以这就是我得到的:
左: 实际行为 ---> 右: 预期行为
并且由于碰撞边界是不可见的,因此碰撞似乎发生在视觉上接触视图之前(由于碰撞边界路径的原点,它们实际上是接触的)。
根据Apple documentation regarding collisionBoundingPath:
The path object you create must represent a convex polygon with
counter-clockwise or clockwise winding, and the path must not
intersect itself. The (0, 0) point of the path must be located at the
center point of the corresponding dynamic item. If the center point
does not match the path’s origin, collision behaviors may not work as
expected.
所以我的主要问题是,由于路径的 (0,0) 坐标必须位于我视图的中心,我怎样才能实现我正在寻找的东西?完美的场景是,如果 UIBezierPath 在其 UIView 的原点开始绘制,但由于我从 SVG 添加路径,它会自动从视图的中心绘制。
您可以使用转换将 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;
}
我正在尝试设置自定义 UIView 的碰撞边界路径。我目前所做的是使用 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;
}
它有效 "correctly" 但 UIBezierPath 绘制在我视图的中心,所以这就是我得到的:
左: 实际行为 ---> 右: 预期行为
并且由于碰撞边界是不可见的,因此碰撞似乎发生在视觉上接触视图之前(由于碰撞边界路径的原点,它们实际上是接触的)。
根据Apple documentation regarding collisionBoundingPath:
The path object you create must represent a convex polygon with counter-clockwise or clockwise winding, and the path must not intersect itself. The (0, 0) point of the path must be located at the center point of the corresponding dynamic item. If the center point does not match the path’s origin, collision behaviors may not work as expected.
所以我的主要问题是,由于路径的 (0,0) 坐标必须位于我视图的中心,我怎样才能实现我正在寻找的东西?完美的场景是,如果 UIBezierPath 在其 UIView 的原点开始绘制,但由于我从 SVG 添加路径,它会自动从视图的中心绘制。
您可以使用转换将 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;
}