2009-07-02 12 views
7

Ich habe eine UIButton in einer UITableView Zelle, in einem UITableView. Das Ergebnis ist eine Liste mit Schaltflächen. Wenn die UIB-Taste gedrückt wird, ruft sie eine touchUpInside-Methode auf, und alles ist großartig. Worauf ich Probleme habe, ist, dass ich eine neue Ansicht aus der Position (Rahmen) der Schaltfläche verkleinern möchte, wenn sie gedrückt wird. Wenn ich nur die Grenzen desEine UIButton in einer UITableViewCell & bekommen Grenzen/frame

UIButton bekommen
origButton.frame 

ist es in den Koordinaten des UITableCell, so etwas wie 3,50,40,25. Dies ist für alle Schaltflächen in der Liste gleich, also egal welche Schaltfläche in der Liste gedrückt wird, dann bekomme ich diese Koordinaten. Nun, wenn ich tatsächlich die Koordinaten meiner Ansicht

self.frame 

greifen, wenn die touchUpInside Methode aufgerufen wird, bekomme ich etwas mehr verwendbar. Ich bekomme dann die Koordinaten meiner Zelle. Groß!! So kann ich eine neue Ansicht aus dem UIButton herauszoomen. Groß!!

Aber hier ist das Problem: Wenn Sie die Liste nach oben scrollen, tippen Sie auf die Schaltfläche, die Ansicht zoomt nicht von der Schaltfläche, sondern von einer Stelle unterhalb des Bildschirms. Das Problem ist, dass die Koordinaten, die ich habe, für die Zelle sind, BEVOR es gescrollt wird. Tatsächlich spiegeln alle Koordinaten für alle Zellen ihre tatsächlichen Positionen in der Tabelle wieder, wobei nur die Koordinaten der ersten sichtbaren Menge verwendbar sind. Scrollen hat diese Koordinaten nicht geändert.

Ich dachte, vielleicht könnte ich die Koordinaten der Super View verwenden, aber diese sind nicht hilfreich.

Wer weiß, wie man genaue Koordinaten für Schaltflächen (oder Ansichten oder andere Elemente) erhält, die in einer Tabelle aufgelistet sind, oder ist das nicht möglich?

Hier ist, wie ich den Mittelpunkt meiner neuen Ansicht berechnen:

floatingView.center = CGPointMake(origButton.frame.origin.x + 
            origButton.frame.size.width/2, 
         self.frame.origin.y + self.superview.frame.origin.y); 

Dank!

Antwort

11

Update:

Denken Sie daran, die ein UITableView eine Scrollview ist. Daher ist contentView in die tabellarische Ansicht (ein scrollView) eingebettet.

Der von Ihnen empfangene Rahmen ist korrekt, bezieht sich jedoch nicht auf den gewünschten Ansichtsrahmen. Stattdessen bezieht sich der Frame auf die contentView. Während des Bildlaufs ändern sich die Zellen nicht in Bezug auf contentView.frame. ContentView.frame ändert sich jedoch in Bezug auf den Rahmen der tableView beim Bildlauf (um den Betrag von contentOffset).

So lässt diese 2 Möglichkeiten:

umrechnen Rahmen der Zelle aus Referenz des content auf die Tableview eine der folgenden Optionen verwenden:

- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view 

- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view 

Oder manuell den Content von der subtrahieren aus Rahmen.

Ich empfehle die erste Methode.


Ursprüngliche Antwort:

Ich bin mir nicht sicher, ob Sie UITableViewCell subclassed oder Durchführung dieser Code aus dem UITableViewController.

Aber ich denke, die Methode, die Sie wollen, ist:

- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath 

Dies ist eine Methode der UITableView ist, dass Sie die rect für jede Zelle erhalten.

+1

Ich war so aufgeregt, als ich das sah. Die zurückgegebenen Koordinaten sind jedoch dieselben wie für self.frame. (Ich habe UITableViewCell subklassifiziert, und die Touch-Methode meines UIButtons ist innerhalb der Unterklasse.) Das oben genannte war ein Drop-in-Ersatz für self.frame. Hier ist ein Beispiel von Werten: Ein Klick auf eine Zelle in der ersten „Seite“ der Tabelle: 0,158,32,480 Klick auf eine Zelle weiter unten: 0,222,32,480 die Tabelle Scrolling Zellen unten zu offenbaren, und dann Klick auf einen: 0,2238,32,480 Irgendwelche anderen Gedanken? – mahboudz

+0

Ich habe die Antwort aktualisiert, um dies zu berücksichtigen –

+1

Vielen Dank. Das ist es! Hier ist die Art, wie ich es benutzt habe: CGRect cellFrame = [self.superview convertRect: self.frame toView: tableViewController.view]; – mahboudz

7

Ich habe versucht, etwas sehr ähnliches zu tun. Wenn auf dem iPad eine Tabellenzelle ausgewählt ist, wollte ich ein Popup neben der Zelle anzeigen. Der folgende Code funktioniert, um so etwas zu tun. In diesem Fall ist self ein UITableViewController.

CGRect rect = [cell.superview convertRect:cell.frame toView:self.view]; 
Verwandte Themen