3

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

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

我确定我在某处看到过这个,但我无法从任何官方来源找到关于该主题的任何文档或讨论。

4

1 回答 1

5

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

但是,您可以将固定的 Bezier 路径添加到碰撞集,它可以是圆形或您可以使用路径制作的任何形状,但它会像其他矩形对象反弹的弯曲墙一样。您可以在 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];

运行它并转到 Item Properties 页面以查看矩形从椭圆形反弹。

于 2014-02-16T18:30:47.293 回答