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

Posted

技术标签:

【中文标题】IOS UIDynamicAnimator maskToBounds 不会使碰撞作为边界工作【英文标题】:IOS UIDynamicAnimator masksToBounds does not make collision work as bounds 【发布时间】:2015-11-01 22:57:52 【问题描述】:

我在 Xcode 7 中工作,适用于 ios 9。目标是使用 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];

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

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

【问题讨论】:

【参考方案1】:

你应该继承 UIView 并重载collisionBoundsType。比如:

-(UIDynamicItemCollisionBoundsType) collisionBoundsType

    return UIDynamicItemCollisionBoundsTypeEllipse;

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于IOS UIDynamicAnimator maskToBounds 不会使碰撞作为边界工作的主要内容,如果未能解决你的问题,请参考以下文章

UIDynamicAnimator items(in:) 在 iOS 11 中崩溃

iOS 使用 UIDynamicAnimator 进行视图控制器转换时如何计算转换持续时间?

UIDynamicAnimator + 自定义 UICollectionViewLayout 导致永久圆周运动

减慢 UIDynamicAnimator 的动画

为啥我的 UIDynamicAnimator 类继承不能使用 addChildBehavior

mas 中scrollview碰到的问题。ios10.0后