在iOS 9中,苹果将collisionBoundsType引入UIKit-Dynamics。
在设置此UIDynamicItemCollisionBoundsTypeRectangle或将其设置为UIDynamicItemCollisionBoundsTypeEllipse时,我没有问题。
下面的屏幕截图来自我正在制作的一款游戏,玩家的collisionBoundsType设置为矩形,球被设置为椭圆:

但是,当我将播放机的collisionBoundsType设置为path时,会出现奇怪的行为,如下所示:

这个视图看起来比它应该的要高,碰撞体在它应该在的位置的右边。
目前,我已经将collisionBoundingPath设置为:
- (UIBezierPath *)collisionBoundingPath
{
maskPath = [[UIBezierPath alloc] init];
[maskPath addArcWithCenter:CGPointMake(SLIME_SIZE, SLIME_SIZE) radius:SLIME_SIZE startAngle:0*M_PI endAngle:M_PI clockwise:NO];
return maskPath;
}此外,我的drawRect函数如下所示:
- (void) drawRect:(CGRect)rect
{
if (!_color){
[self returnDefualtColor];
}
if (!maskPath) maskPath = [[UIBezierPath alloc] init];
[maskPath addArcWithCenter:CGPointMake(SLIME_SIZE, SLIME_SIZE) radius:SLIME_SIZE startAngle:0*M_PI endAngle:M_PI clockwise:NO];
[_color setFill];
[maskPath fill];
}为什么会发生这种情况?如何将碰撞体的路径设置为与视图中的绘图相同?
此外,红色只是视图的背景(即view.backgroundColor = [UIColor redColor];)。
发布于 2015-10-22 10:53:13
从UIDynamicItem 这里的文档中,关于路径坐标系统的以下语句似乎代表了问题所在:
您创建的path对象必须表示具有逆时针或顺时针缠绕的凸多边形,并且路径不能与自身相交。路径的(0,0)点必须位于相应的动态项的中心点。如果中心点不匹配路径的起源,碰撞行为可能不会像预期的那样工作。
这里它声明路径的(0,0)必须是中心点。
我认为弧形路径的中心应该是(0,0),而不是(SLIME_SIZE/2,SLIME_SIZE/2)。您是否将UIView帧的宽度和高度设置为SLIME_SIZE而不是SLIME_SIZE*2?
SLIME_SIZE似乎确实定义了半径,所以帧宽应该是SLIME_SIZE*2。如果它被设置为SLIME_SIZE,那么这就解释了为什么需要由SLIME_SIZE/2作为更正进行翻译。
发布于 2015-10-22 04:52:17
我通过改变来回答这个问题:
- (UIBezierPath *)collisionBoundingPath
{
maskPath = [[UIBezierPath alloc] init];
[maskPath addArcWithCenter:CGPointMake(SLIME_SIZE, SLIME_SIZE) radius:SLIME_SIZE startAngle:0*M_PI endAngle:M_PI clockwise:NO];
return maskPath;
}至:
- (UIBezierPath *)collisionBoundingPath
{
maskPath = [[UIBezierPath alloc] init];
[maskPath addArcWithCenter:CGPointMake(SLIME_SIZE / 2, SLIME_SIZE / 2) radius:SLIME_SIZE startAngle:0*M_PI endAngle:M_PI clockwise:NO];
return maskPath;
}关键的区别是,我修改了弧的中心,将x和y值除以2。
发布于 2015-10-22 07:58:58
调试物理是一回事。这可能不是iOS用户倾向于考虑的事情,因为他们通常使用UIKit Dynamic做了非常简单的事情。这有点遗憾,因为它是最近版本的iOS的最佳方面之一,并提供了一个真正有趣的方式来创造引人注目的用户体验。
所以..。如何调试物理?
一种方法是在心理上想象发生了什么,然后把它和正在发生的事情联系起来,找出想象和真实之间的不一致,然后通过消除,心理或真实的尝试和推理的过程来解决问题,直到问题被确定和解决为止。
另一种方法是对所有被创造和相互作用的事物进行直观的描述,提供足够的反馈,以便更快地确定元素的性质和范围、它们的关系和事件/事件,并用字面的眼光解决问题。
为此,自引入以来,各种可视化调试器和物理模拟构建器已经被创建。
不幸的是,iOS没有这样一个基于屏幕的编辑器或用于UIKit Dynamic的“场景编辑器”,而且在雪碧工具包和场景工具包中这种可视化调试的可用功能充其量只是初级的。
但是,在所有的CALayers视图中都存在CALayers,可以手动创建和绘制CAShapeLayers,以准确地表示任何和所有物理元素、它们的界限以及它们的锚点和关系。
CAShapeLayers是CGPaths的“容器”,它可以有不同的颜色用于轮廓和填充,并且在单个CAShapeLayer中有多个CGPath元素。
引用伟大的罗伯的话:
“如果将CAShapeLayer作为图层添加到视图中,则无需自己实现任何绘图代码。只需添加CAShapeLayer即可完成。例如,以后可以更改路径,它将自动为您重新绘制路径。CAShapeLayer使您摆脱了编写自己的drawRect或drawLayer例程的麻烦。”
如果您有大量的交互元素并希望对它们进行调试,那么CAShapeLayer的性能问题可能会起作用,此时您可以使用shouldRasterize将每个元素转换为位图,并在达到CAShapeLayers的“动态”功能所造成的限制时获得显著的性能改进。
此外,为了表示约束和连接之类的东西,只需设置属性,就可以在CAShapeLayers上创建虚线的简单过程。以下是设置CAShapeLayer属性的基础知识,以及使用数组创建5-5-5虚线轮廓的方法,其宽度为3,没有填充。
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
[shapeLayer setBounds:self.bounds];
[shapeLayer setPosition:self.center];
[shapeLayer setFillColor:[[UIColor clearColor] CGColor]];
[shapeLayer setStrokeColor:[[UIColor blackColor] CGColor]];
[shapeLayer setLineWidth:3.0f];
[shapeLayer setLineJoin:kCALineJoinRound];
[shapeLayer setLineDashPattern:
[NSArray arrayWithObjects:[NSNumber numberWithInt:10],
[NSNumber numberWithInt:5],nil]];https://stackoverflow.com/questions/33116686
复制相似问题