2016-04-04 3 views
0

Ich habe eine benutzerdefinierte UIView, die den Bildschirm abdecken soll, sobald der Benutzer auf eine Schaltfläche klickt. Es simuliert eine benutzerdefinierte Ansicht. In der benutzerdefinierten UIView gibt es eine untergeordnete UIView, die von unten (zunächst verborgen) bis zur normalen Position (unten) animiert werden sollte. Das Problem, das ich habe, ist, dass es wie Layoutsubviews ist ein schlechter Ort, um mit Animationen zu beginnen. Wo wäre der richtige Ort? Etwas wie viewDidAppear, aber für UIViews.Starten Sie die Animation, sobald eine UIView auf dem Bildschirm angezeigt wird

In UIViewController:

let rect: CGRect = CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height) 
let alertView = AlertView(frame: rect) 
view.addSubview(alertView) 

Im Alertview:

import UIKit 

class AlertView: UIView { 

let nibName = "AlertView" 
let animationDuration = 0.5 

var view: UIView! 

@IBOutlet weak var notificationView: UIView! 
@IBOutlet weak var notificationBottomConstraint: NSLayoutConstraint! 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    viewSetup() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    viewSetup() 
} 

override func didAddSubview(subview: UIView) { 
    super.didAddSubview(subview) 
} 

func viewSetup() { 
    view = loadViewFromNib() 
    view.frame = bounds 
    view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight] 

    // move the notification view offscreen 
    notificationBottomConstraint.constant = -notificationView.frame.size.height 

    addSubview(view) 
} 

func loadViewFromNib() -> UIView { 
    let bundle = NSBundle(forClass: self.dynamicType) 
    let nib = UINib(nibName: nibName, bundle: bundle) 

    return nib.instantiateWithOwner(self, options: nil)[0] as! UIView 
} 

override func layoutSubviews() { 
    super.layoutSubviews() 
    print("layoutSubviews") 

    animate() 
} 

func animate() { 
    // move the notification up 
    self.notificationBottomConstraint.constant = 0 

    UIView.animateWithDuration(animationDuration) {() -> Void in 
     self.view.setNeedsDisplay() 
    } 
} 

}

Antwort

0

Ihre letzte Einschränkung Wert ist nicht in Ihrem belebtes Schließung. Versuchen Sie folgendes:

func animate() { 
    // move the notification up 
    UIView.animateWithDuration(animationDuration) {() -> Void in 
     self.notificationBottomConstraint.constant = 0 
     self.view.setNeedsDisplay() 
    } 
} 
+0

Es braucht nicht innerhalb der Animation Schließung zu sein. Arbeitet auch draußen. –

0

Ich schlage vor, Sie von einer dieser Methoden, um Ihre animate() Funktion aufzurufen:

  • willMoveToSuperview:
  • didMoveToSuperview

Diese Methoden der UIView nach Bedarf die verfolgen Bewegung der aktuellen Ansicht in Ihrer Sichthierarchie.

Referenz:UIView class

+0

Danke, ich werde didMoveToSuperView verwenden. Aber das war nicht die Lösung. Die Lösung bestand darin, vor dem Schließen der Animation noch einen weiteren Aufruf von view.setNeedsDisplay() hinzuzufügen. –

+0

Sorry, ich möchte stattdessen layoutIfNeeded() aufrufen. –

Verwandte Themen