我正在尝试弄清楚如何使用 UIKit Dynamics 成功地碰撞两个具有自定义边界形状的 UIView。
我能想到的最基本的例子来解释我的问题是让两个圆碰撞(考虑到它们的圆角)而不是它们的方形边界。
我确定我在某个地方看到过这个,但我无法从任何官方来源找到关于该主题的任何文档或讨论。
最佳答案
我也想这样做,但我认为您不能在当前的 iOS 7 UIKit Dynamics 下做到这一点。添加到动画器的项目必须采用 UIDynamicItem 协议(protocol)(UIView 可以)。该协议(protocol)仅通过 bounds 属性将它们的边界指定为矩形,这是一个 CGRect。没有自定义 HitTest 。
但是,您可以将固定的贝塞尔曲线路径添加到碰撞集中,它可以是圆形或您可以用路径制作的任何形状,但它会像其他矩形对象反弹的弯曲墙一样。您可以修改 Xcode 中的 DynamicsCatalog 示例代码,以查看不移动的弯曲边界的使用。
创建一个名为 BumperView 的新 View 文件,它是 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];
}
在 Item Properties 页面的 Storyboard 中,在框下方某处添加一个 View 并将其类更改为 BumperView,并将其背景颜色更改为清除。 在 APLItemPropertiesViewController.m 中为它创建一个名为 bumper 的导出,但给它类 BumperView。 在创建 collisionBehavior 之后,在 viewDidAppear 函数中添加以下内容:
UIBezierPath *bumperPath = [UIBezierPath bezierPathWithOvalInRect:self.bumper.frame];
[collisionBehavior addBoundaryWithIdentifier:@"Bumper" forPath:bumperPath];
运行它并转到 Item Properties 页面以查看矩形从椭圆形反弹。
关于ios - UICollisionBehavior - UIView 碰撞的自定义形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21650208/