2013-05-13 13 views
9

Ich muss das Einfügen einer Tabellenansicht Header-Ansicht animieren. Ich möchte, dass die Tabellenzeilen nach unten gleiten, während die Kopfansicht ihren Rahmen erweitert.
Bisher das beste Ergebnis bekam ich durch den folgenden Code:Wie animiere ich UITableView Header-Ansicht

[self.tableView beginUpdates]; 
[self.tableView setTableHeaderView:self.someHeaderView]; 
[self.tableView endUpdates]; 

Das Problem bei dieser Lösung ist, dass der Header selbst nicht animiert erhält, dessen Rahmen sich nicht ausdehnt.

Also der Effekt, den ich bekomme, ist, dass die Tabellenzeilen nach unten gleiten (wie ich will), aber die Header-Ansicht wird sofort angezeigt, und ich möchte es seinen Rahmen mit Animation erweitern.

Irgendwelche Ideen?

Danke.

+1

versuchen http://stackoverflow.com/questions/2659428/how-to-animate-the-height-change-of-an-section-header-in- uitableview –

Antwort

15

haben die Header-Frame an CGRectZero und seinen Rahmen gesetzt Animation

[self.tableView beginUpdates]; 
[self.tableView setTableHeaderView:self.someHeaderView]; 

[UIView animateWithDuration:.5f animations:^{ 
    CGRect theFrame = someBigger.frame; 
    someHeaderView.frame = theFrame; 
}]; 

[self.tableView endUpdates]; 
+0

Funktioniert nicht, es sieht so aus, als wenn Sie die Kopfzeile der Tabelle mit einer Ansicht mit der Höhe Null setzen, dann, egal ob Sie diese Ansichtshöhe ändern, wird sich die Kopfzeile der Tabelle nicht ändern. – Mario

+0

versuchen Sie dann, die Höhe für die TableHeaderView in der Animation anstelle des Frame someHeaderView zu erhöhen – Bonnie

+7

Die Aufrufe 'beginUpdates' und' endUpdates' sind nicht erforderlich. –

5

Die gewählte Antwort nicht für mich arbeiten mit. Hat folgende zu tun:

[UIView animateWithDuration: 0.5f 
       animations: ^{ 
        CGRect frame = self.tableView.tableHeaderView.frame; 
        frame.size.height = self.headerViewController.preferredHeight; 
        self.tableView.tableHeaderView.frame = frame; 
        self.tableView.tableHeaderView = self.tableView.tableHeaderView; 
        }]; 

Das wirklich eigentümlich ist, dass das funktioniert in einer Ansicht, die jedoch nicht in einer Unterklasse der gleichen View-Controller/View-Hierarchie.

+0

Warum ist 'self.tableView.tableHeaderView = self.tableView.tableHeaderView;' erforderlich? Es geht nicht ohne diese scheinbar redundante Linie. – OpenUserX03

+0

@ OpenUserX03 Einverstanden, dass es überflüssig ist, aber das Zurücksetzen des Rahmens wurde benötigt, damit es für mich funktioniert. – greg

+0

@ OpenUserX03 Ich sah die gleiche Sache, ich muss die 'tableHeaderView' neu setzen, um die TableView zu bekommen, um die neue Größe zu bemerken. Sie tun wahrscheinlich etwas im 'didSet', da es sich um eine Klassenreferenz handelt, nicht um eine Struktur, also ist nur ein Zeiger auf einen identischen Ort. http://stackoverflow.com/questions/16518580/how-to-animate-uitableview-header-view/16518713#comment61586382_16518713 – SimplGy

11

Hier ist, was ich in Swift, mit einer anfänglichen Rahmenhöhe von Null und Aktualisierung der es auf seine volle Höhe in den Animationen Schließung zu arbeiten bekam:

// Calculate new frame size for the table header 
var newRect = tableView.tableHeaderView?.frame 
newRect?.size.height = 42 
// Get the reference to the header view 
let tblHeaderView = self.tableView.tableHeaderView 
// Animate the height change 
UIView.animateWithDuration(0.6, animations: {() -> Void in 
    tblHeaderView?.frame = newRect! 
    self.tableView.tableHeaderView = tblHeaderView 
}) 
+1

Dies funktioniert für mich. Damit die Header-Größe und die Animationen der TableCell-Animationen synchronisiert werden konnten, musste ich eine animationDuration von 0.3 verwenden. Auf iOS 9 ist das. –

+1

Das Neuzuweisen der tableHeaderView im Animationsblock funktionierte auch für mich. Dies sollte die akzeptierte Antwort sein. –

0

fand ich die endgültige und richtige Weg, eine echte zu erreichen Animation auf tableHeaderView s!

• Wenn Sie sich in Autolayout befinden, behalten Sie das System Margin in Ihrer Kopfzeile. Mit Xcode 8 ist es jetzt möglich (endlich!), Setze keine Einschränkung auf irgendeine der Header-Subviews. Sie müssen die richtigen Ränder festlegen.

• Dann beginUpdates und endUpdates verwenden, aber setzen endUpdatein der Block-Animation.

Hinweis: Ich habe nur in iOS10 versucht, ich werde ein Update veröffentlichen, wenn mein iOS9-Simulator heruntergeladen wird.

EDIT

Leider funktioniert es nicht so gut in iOS9 als iOS10: der Header selbst seine nicht Höhe ändern, aber Kopf Subviews scheint, als ob die Header-Grenzen geändert zu bewegen.

-1

Verwenden Sie den folgenden Code funktioniert dies

extension UITableView { 

func hideTableHeaderView() -> Void { 
    self.beginUpdates() 
    UIView.animate(withDuration: 0.2, animations: { 
     self.tableHeaderView = nil 
    }) 
    self.endUpdates() 
} 

func showTableHeaderView(header: UIView) -> Void { 
    let headerView = header 
    self.beginUpdates() 
    let headerFrame = headerView.frame 
    headerView.frame = CGRect() 
    self.tableHeaderView = headerView 
    UIView.animate(withDuration: 0.2, animations: { 
     self.tableHeaderView?.frame = headerFrame 
     self.tableHeaderView?.alpha = 0 
     self.endUpdates() 
    }, completion: { (ok) in 
     self.tableHeaderView?.alpha = 1 
    }) 
    } 
} 
Verwandte Themen