IOS UIDynamicAnimator masksToBounds不会使碰撞工作为边界

时间:2015-11-01 22:57:52

标签: ios objective-c uidynamicbehavior uidynamicanimator

我在Icode 9的Xcode 7应用程序中工作。目标是使用UIDynamicAnimator,UIGravityBehavior和UICollisionBehavior使圆形对象像球一样运行。 一切都很好,除了UIViews(代表球)看起来很圆,但在碰撞过程中表现得像矩形一样。 构建和添加球的代码'是:

-(void) addBall{
    CGRect frame;
    frame.origin=CGPointZero;
    frame.size = [self randomsize];
    int x = (arc4random()%(int)self.inputView.bounds.size.width);
    frame.origin.x = x;
    UIView *bullet = [[UIView alloc] initWithFrame:frame];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10,10,40,20)];
    label.text = @"label";
    bullet.backgroundColor = [self randomColor];
    bullet.layer.cornerRadius = bullet.frame.size.width/2;
    bullet.layer.borderWidth = 2.0;
    bullet.layer.borderColor = [UIColor blackColor].CGColor;
    bullet.layer.masksToBounds=YES;

    [bullet addSubview:label];
    [self.inputView addSubview:bullet];
    [self.gravity addItem:bullet];
    [self.collider addItem:bullet];
}

需要设置哪个属性才能使这些对象表现得像圆形?

以下是应用程序的屏幕,显示重力和碰撞如何影响地面/边界上的形状。 我在屏幕截图上绘制矩形边框,以显示不可见的真实边框,但防止球表现为圆形对象。

application screenshot1

2 个答案:

答案 0 :(得分:3)

你应该继承UIView并重载collisionBoundsType。类似的东西:

-(UIDynamicItemCollisionBoundsType) collisionBoundsType
{
    return UIDynamicItemCollisionBoundsTypeEllipse;
}

答案 1 :(得分:1)

在Swift中你可以只创建一个扩展而不是创建一个可能比beyowulfs更容易回答的子类,如果你只需要它就可以把它放在你的类的底部

extension UIView {
    func collisionBoundsType () -> (UIDynamicItemCollisionBoundsType) {
        return UIDynamicItemCollisionBoundsType.ellipse
    }
}