UICollisionBehavior - UIView碰撞的自定义形状

时间:2014-02-08 18:39:58

标签: ios objective-c uiview uikit-dynamics uicollisionbehavior

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

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

我确定我已经在某个地方看到了这个,但我找不到任何官方来源关于这个主题的任何文件或讨论。

1 个答案:

答案 0 :(得分: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];
}

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

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

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