UICollisionBehavior - UIView碰撞的自定义形状

Ada*_*ter 3 objective-c uiview ios uicollisionbehavior uikit-dynamics

我试图弄清楚如何使用UIKit Dynamics成功碰撞两个具有自定义边界形状的UIViews.

我可以想到解释我的问题的最基本的例子是让两个圆碰撞(考虑他们的圆角)而不是他们的方形边界.

我确定我已经在某个地方见过这个但我无法从任何官方消息来源找到关于这个主题的任何文件或讨论.

小智 5

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

但是,您可以向碰撞集添加固定的贝塞尔曲线路径,它可以是圆形或任何可以用路径制作的形状,但它可以像其他矩形物体反弹的弯曲墙一样.您可以修改Xcode中的DynamicsCatalog示例代码,以查看使用不移动的曲线边界.

创建一个名为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];
}
Run Code Online (Sandbox Code Playgroud)

在"项目属性"页面的故事板中,在框下方的某处添加一个视图,并将其类更改为BumperView,并将其背景颜色更改为清除.在APLItemPropertiesViewController.m中为它创建一个名为bumper的插座,但是给它类BumperView.在创建了collisionBehavior之后,在viewDidAppear函数中添加以下内容:

UIBezierPath *bumperPath = [UIBezierPath bezierPathWithOvalInRect:self.bumper.frame];
[collisionBehavior addBoundaryWithIdentifier:@"Bumper" forPath:bumperPath];
Run Code Online (Sandbox Code Playgroud)

运行它并转到"项目属性"页面以查看椭圆形反弹的矩形.