2017-07-14 7 views
1

In unserer App haben wir eine benutzerdefinierte Benachrichtigung, die im Grunde ein Kreis innerhalb der UITabBarItem ist. Ich habe es hinzugefügt, indem ich die Ansicht von UITabBarItem und dann eine CAShapeLayer in einer geeigneten Position erstellt habe. Leider, egal was ich versuche, kann ich nicht die Form animieren. Ich habe versucht, verschiedene Eigenschaften wie path und fillColor ohne Erfolg zu animieren.iOS benutzerdefinierte Animation in UITabBarItem

Hier ist ein Codeauszug:

var lyrShape = CAShapeLayer() 
lyrShape.fillColor = UIColor.red.cgColor 
lyrShape.path = UIBezierPath(overIn: CGRect(x: 5, y: 5, width: 10, height: 10)).cgPath 

vwTabBar.layer.addSublayer(lyrShape) 

var aniShape = CABasicAnimation(keyPath: "fillColor") 
aniShape.duration = 5 
aniShape.toValue = UIColor.blue.cgColor 
aniShape.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
aniShape.fillMode = kCAFillModeBoth 
aniShape.autoreverses = true 
aniShape.repeatCount = 20 

lyrShape.add(aniShape, forKey: aniShape.keyPath) 

ich diesen Code in regulären Ansichten habe versucht und es funktioniert super, aber egal was ich versuche ich kann sie nicht in den UITabBarItem arbeiten.

UPDATE: Ich habe die genauen Schritte herausgefunden, um diesen Fehler zu reproduzieren. Starten Sie Ihre App mit einem einfachen alten View-Controller mit einer Schaltfläche aus. Klicken Sie auf diese Schaltfläche, um die Registerkartenansicht anzuzeigen. Die Formen, die Sie im TabBarItem zeichnen, werden zu diesem Zeitpunkt nicht animiert. JEDOCH: Wenn der TabBarController als erste Ansicht gestartet wird, passiert die Animation ganz gut.

Hat jemand irgendwelche Ideen?

Danke!

Antwort

0

Zuerst werde ich sagen, dass Sie eine gute Frage gestellt haben. Ich war sogar auf der Suche nach etwas ähnlichem und bekam meine Antwort. Sie benötigen einen benutzerdefinierte Klasse von UITabBarController machen und dann können Sie etwas wie unten tun:

override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) { 
    if item.tag == 1{ 
    //do our animations 
     self.secondItemImageView.transform = CGAffineTransformIdentity 
     UIView.animateWithDuration(0.7, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: .CurveEaseInOut, animations: {() -> Void in 
      let rotation = CGAffineTransformMakeRotation(CGFloat(M_PI_2)) 
      self.secondItemImageView.transform = rotation 
     }, completion: nil) 
    } 
} 

Ich habe diese Antwort einen Blog-Post bilden ich kürzlich las. Für weitere Klarheit davon würde ich Ihnen empfehlen, diesen Blog zu verweisen: https://medium.com/@werry_paxman/bring-your-uitabbar-to-life-animating-uitabbaritem-images-with-swift-and-coregraphics-d3be75eb8d4d

Ich hoffe, dies wird Ihnen helfen :)

+0

Hallo! Danke für die schnelle Antwort. JEDOCH: Ich sehe keinen Grund, warum Sie dies von UITabBarController erben müssen. Was ändert sich? Außerdem: Ich möchte kein Bild animieren. Vielmehr möchte ich einen CAShapeLayer innerhalb des von mir hinzugefügten UITabBarItem animieren. Können Sie erklären, warum das Erben von UITabBarController funktioniert? Und warum, wenn du es nicht tust, nicht? Danke! –

+0

Ich denke, weil wir die Unteransichten der Tableiste nicht iterieren können und wir auch nicht direkt auf die imageview -Eigenschaft zugreifen können. Subclassing gibt Ihnen die Flexibilität, Ihren benutzerdefinierten Code und Ihr Verhalten hinzuzufügen. –

+0

Eigentlich kann man auf verschiedene Arten die Ansicht eines UITabBarItems bekommen. Er zeigt sogar einen wirklich hacky Weg in seinem Beitrag, um die UIImage zu bekommen. Ich wiederhole und teste nach Ansichten eines bestimmten Typs, aber du kannst auf jeden Fall in die Ansicht kommen ... Danke nochmal, dass du wieder zu mir gekommen bist. Ich schätze den Input! –

0

So endlich hörte ich von Apple zurück, nachdem ich einen Fehlerbericht vorgelegt. Sie sagten mir, was ich tat, wurde nicht unterstützt, und sie würden es nicht beheben. Nicht gerade die Antwort, die ich suchte, aber es ist zumindest eine Antwort.

Hoffe das hilft anderen da draußen, die auch darauf stoßen.

James