2016-05-04 9 views
2

Ich versuche, eine benutzerdefinierte Alertview mit dynamischem Verhalten UIDynamicAnimator in NSObject-Klasse mit Swift erstellen, während Hinzufügen von UISnapBehaviour zu einer Ansicht in NSObject Klasse init Methode Snap-Verhalten nicht funktioniert schauen, zum Beispiel unter dem unten genannten CodeWie füge ich dynamisches Verhalten in NSObject-Klasse hinzu: Swift

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“ als Subview „Target“ hinzugefügt, aber das Verhalten Snap funktioniert nicht.

ich den gleichen Code in Objective

versuchte
#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 

es funktioniert gut, schnappt der „Testview“ zum Zentrum von TargetView.I weiß nicht, was ist falsch mit SWIFT-Code.

Hier ist, was ich versucht habe:

  1. Die dynamische Wirkung fein arbeitet, wenn in UIViewController Klasse codiert, existieren Problem nur während Subklassen NSObject in schnell.
  2. Ich habe versucht, die anderen dynamischen Verhaltensweisen wie UIGravityBehavior das gleiche Problem in Swift existiert.
  3. Erledigt die gleiche Beispielarbeit in ObjectiveC Objektklasse, es funktioniert gut, ich habe auch den funktionierenden ObjC Code angehängt.

Es scheint, dass das Problem in init-Methode oder Variable decleration existieren sind nicht sicher, dass Aber ich weiß nicht, wie das Problem zu beheben. Ich habe viele Artikel im Internet gelesen. Ich habe auch StackOverflow gesucht. Bitte helfen Sie.

Antwort

0

Ihr Code in Swift ist nicht genau der selbe wie Objective-C Code: Objective-C Code hat eine starke Referenz Snap_behaviour, aber Swift Code hat nur lokale readonly Variable. Hier ist der Swift-Äquivalent:

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) 

    } 
} 

Normalerweise verwende ich UIDynamicBehaviour als Basisklasse für kombinierte Verhaltensweisen wie diese

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() 
    } 
} 

Setzen Sie diesen Code in Ihren Controller

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

Dank Andriy für Ihre Antwort , jetzt hatte ich stark "Snap_behaviour" erklärt, aber ich bin noch nicht in der Lage, dynamische Wirkung auf meinen Code zu bekommen. Dann Code, der von Ihnen empfohlen wurde, funktioniert perfekt. Ich habe U hinzugefügt IGravityBehaviour zu Ihrer "CombinedBehavior" -Klasse funktioniert es gut.Wenn ich versuche, UISnapBehaviour hinzuzufügen, löst es einen Laufzeitfehler aus. ** init ist für Objekte vom Typ UISnapBehavior ** nicht definiert. kannst du mir helfen, es zu lösen? – Gokul

+0

var snap: UISnapBehavior? { willSet { wenn Snap! = Nil { animator.removeBehavior (Snap!) } } didSet { wenn Snap! = Nil { animator.addBehavior (Snap!) } } } // Setzen Sie das, wo Sie einrasten müssen, normalerweise in UILongPressPressureRecognazier: snap = UISnapBehavior (Element: selectedDrop !, snapToPoint: Punkt) // Entfernen Sie, wenn Sie mit Snap: snap = nil –

Verwandte Themen