Ios UICollisionBehavior-UIView碰撞的自定义形状

Ios UICollisionBehavior-UIView碰撞的自定义形状,ios,objective-c,uiview,uikit-dynamics,uicollisionbehavior,Ios,Objective C,Uiview,Uikit Dynamics,Uicollisionbehavior,我正试图找出如何使用UIKit Dynamics成功碰撞两个具有自定义边界形状的UIView 我能想到的解释我的问题的最基本的例子是两个圆碰撞(考虑到它们的圆角),而不是它们的正方形边界 我肯定我在某个地方看到过这一点,但我找不到任何官方来源关于这一主题的任何文档或讨论。我也想这样做,但我认为在当前iOS 7的UIKit Dynamics下,您无法做到这一点。添加到动画师的项目必须采用UIDynamicItem协议(UIView不采用)。协议仅通过bounds属性(即CGRect)将其边界指定为

我正试图找出如何使用UIKit Dynamics成功碰撞两个具有自定义边界形状的UIView

我能想到的解释我的问题的最基本的例子是两个圆碰撞(考虑到它们的圆角),而不是它们的正方形边界


我肯定我在某个地方看到过这一点,但我找不到任何官方来源关于这一主题的任何文档或讨论。

我也想这样做,但我认为在当前iOS 7的UIKit Dynamics下,您无法做到这一点。添加到动画师的项目必须采用UIDynamicItem协议(UIView不采用)。协议仅通过bounds属性(即CGRect)将其边界指定为矩形。没有自定义的命中测试

但是,可以向碰撞集中添加固定的Bezier路径,该路径可以是圆形,也可以是使用路径生成的任何形状,但其作用类似于曲面墙,其他矩形对象可以从曲面上反弹。您可以在Xcode中修改DynamicCatalog示例代码,以查看不移动的曲线边界的使用情况

创建一个名为BumperView的新视图文件,它是UIView的子类。 在BumperView.m中,使用以下drawRect:

#define LINE_WIDTH 2.0
- (void)drawRect:(CGRect)rect
{
    UIBezierPath *ovalPath = [UIBezierPath bezierPathWithOvalInRect:CGRectInset(self.bounds, LINE_WIDTH/2, LINE_WIDTH/2)];
    [[UIColor blueColor] setStroke];
    [[UIColor lightGrayColor] setFill];
    ovalPath.lineWidth = LINE_WIDTH;
    [ovalPath stroke];
    [ovalPath fill];
}
在“项目属性”页面的情节提要中,在框下方的某个位置添加视图,并将其类更改为BumperView,将其背景色更改为clear。 在AplitePropertiesViewController.m中为它创建一个名为Buffer的出口,但给它一个BumperView类。 创建collisionBehavior后,在ViewDidAspect函数中添加以下内容:

UIBezierPath *bumperPath = [UIBezierPath bezierPathWithOvalInRect:self.bumper.frame];
[collisionBehavior addBoundaryWithIdentifier:@"Bumper" forPath:bumperPath];

运行它并转到“项目属性”页面,以查看长方形从椭圆形反弹。

为了方便将来的读者,在iOS 9中,现在可以使用
UIDynamicItem
Properties
collisionBoundsType
collisionBoundingPath