如何在NSObject类中添加动态行为:Swift

时间:2016-05-04 06:39:57

标签: ios swift uidynamicanimator uisnapbehavior

我尝试使用swift在NSObject类中使用UIDynamicAnimator创建具有动态行为的自定义警报视图,而在NSObject类中将UISnapBehavi添加到视图时,init方法快照行为无法正常工作,例如,请查看以下代码< / p>

import UIKit

class DynamicBehaviour: NSObject {

var Animator:UIDynamicAnimator!
var TargetView:UIView!
var TestView:UIView!

override init() {
    super.init()
}

init(SourceViews:UIView) {
    super.init()

    TestView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    TestView.backgroundColor = UIColor.blueColor()
    TargetView.addSubview(TestView)

    Animator = UIDynamicAnimator(referenceView: TargetView)
    let snapBehavior: UISnapBehavior = UISnapBehavior(item: TestView, snapToPoint: TargetView.center)
    Animator.addBehavior(snapBehavior)

  }
}

&#34; TestView&#34;作为子视图添加到&#34;目标&#34;但是快照行为不起作用。

我在ObjectiveC中尝试了相同的代码

#import "DynamicBehaviour.h"
#import <UIKit/UIKit.h>

@interface DynamicBehaviour ()
@property(nonatomic,strong)UISnapBehavior * Snap_behaviour;
@property (nonatomic,strong)UIDynamicAnimator * Animator;


@end
@implementation DynamicBehaviour

-(instancetype)initWithSourceView:(UIView *)TargetView{
   if (self = [super init]) {
      UIView * TestView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100,     100)];
      TestView.backgroundColor = [UIColor blueColor];
      [TargetView addSubview:TestView];

      self.Animator = [[UIDynamicAnimator    alloc]initWithReferenceView:TargetView];
       self.Snap_behaviour = [[UISnapBehavior alloc]initWithItem:TestView snapToPoint:TargetView.center];
       [self.Animator addBehavior:self.Snap_behaviour];
   }
  return self;
  }


 @end

它工作正常,&#34; TestView&#34;捕捉到TargetView的中心。我不知道swift代码有什么问题。

以下是我尝试的内容:

  1. 在UIViewController类中编码时,动态效果正常,只有在swift中继承NSObject时才会出现问题。
  2. 我尝试过其他动态行为,例如UIGravityBehavior,swift中存在同样的问题。
  3. 在ObjectiveC对象类中完成相同的示例工作,它的工作正常,我也附加了工作的ObjC代码。
  4. 似乎问题可能存在于init方法或变量decleration中我不确定 但是,我不知道如何解决这个问题。我在互联网上阅读了很多文章。我也搜索过StackOverflow。请帮忙。

1 个答案:

答案 0 :(得分:0)

您在Swift中的代码与Objective-C代码并不完全相同:Objective-C代码具有强大的参考Snap_behaviour,但Swift代码只有本地只读变量。 这是Swift的等价物:

class DynamicBehaviour: NSObject {

    var Animator:UIDynamicAnimator!
    var snapBehaviour:UISnapBehavior!
    var TargetView:UIView!
    var TestView:UIView!

    override init() {
        super.init()
    }

    init(SourceViews:UIView) {
        super.init()

        TestView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        TestView.backgroundColor = UIColor.blueColor()
        TargetView.addSubview(TestView)

        Animator = UIDynamicAnimator(referenceView: TargetView)
        snapBehaviour = UISnapBehavior(item: TestView, snapToPoint: TargetView.center)
        Animator.addBehavior(snapBehaviour)

    }
}

通常我使用UIDynamicBehaviour作为此类组合行为的基类

class CombinedBehavior: UIDynamicBehavior {

    lazy var collider: UICollisionBehavior = {
        let lazilyCreatedCollider = UICollisionBehavior()
        lazilyCreatedCollider.translatesReferenceBoundsIntoBoundary = true
        lazilyCreatedCollider.collisionMode = UICollisionBehaviorMode.Everything
        return lazilyCreatedCollider
    }()

    lazy var itemBehavior: UIDynamicItemBehavior = {
        let lazilyCreatedBehavior = UIDynamicItemBehavior()
        lazilyCreatedBehavior.allowsRotation = true
        lazilyCreatedBehavior.elasticity = 0
        lazilyCreatedBehavior.resistance = 100
        lazilyCreatedBehavior.angularResistance = 100
        lazilyCreatedBehavior.friction = 100
        return lazilyCreatedBehavior
    }()

    override init() {
        super.init()
        addChildBehavior(collider)
        addChildBehavior(itemBehavior)
    }

    func addBarrier(path: UIBezierPath, named name: String) {
        collider.removeBoundaryWithIdentifier(name)
        collider.addBoundaryWithIdentifier(name, forPath: path)
    }

    func addView(view: UIView) {
        dynamicAnimator?.referenceView?.addSubview(view)
        collider.addItem(view)
        itemBehavior.addItem(view)
    }

    func removeView(view: UIView) {
        collider.removeItem(view)
        itemBehavior.removeItem(view)
        view.removeFromSuperview()
    }
}

将此代码放入您的控制器

lazy var animator: UIDynamicAnimator = {
    let lazilyCreatedDynamicAnimator = UIDynamicAnimator(referenceView: self.view) // or any view you needed
    // if you need delegate in your controller uncomment this
    //        lazilyCreatedDynamicAnimator.delegate = self
    return lazilyCreatedDynamicAnimator
}()

var combinedBehavior = CombinedBehavior()

override func viewDidLoad() {
    // your other code
    animator.addBehavior(combinedBehavior)
}