首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NSObject类中添加动态行为: Swift

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

Stack Overflow用户
提问于 2016-05-04 06:39:57
回答 1查看 724关注 0票数 2

我正在尝试使用UIDynamicAnimator在NSObject类中使用NSObject类使用UISnapBehaviour创建一个动态行为的自定义警报视图,同时将UISnapBehaviour添加到NSObject类中的视图中,init方法snap行为不起作用,例如,查看下面的代码

代码语言:javascript
复制
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)

  }
}

"TestView“作为子视图添加到”目标“中,但是快照行为不起作用。

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

代码语言:javascript
复制
#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

它工作得很好,"TestView“冲到了TargetView.I的中心,我不知道快速代码有什么问题。

以下是我尝试过的:

  1. 在UIViewController类中编码时,动态效果很好,只有在NSObject子类中才存在问题。
  2. 我尝试过其他的动态行为,如UIGravityBehavior,同样的问题也在迅速地存在。
  3. 在ObjectiveC对象类中完成相同的示例工作--它的工作很好--我也附加了工作的ObjC代码。

似乎这个问题可能存在于init方法或变量解密不确定,但我不知道如何解决这个问题。我在网上读过很多文章。我还搜索过StackOverflow。请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2016-05-04 08:08:56

Swift中的代码与Objective代码不完全相同:Objective代码有很强的引用Snap_behaviour,但是Swift代码只有本地只读变量。以下是Swift的等价物:

代码语言:javascript
复制
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作为组合行为的基类,如

代码语言:javascript
复制
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()
    }
}

将此代码放入控制器中。

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37020260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档