2016-07-02 7 views
0

Ich habe versucht, dies auf SO zu suchen, aber kein Glück, etwas zu finden, das für meine Situation funktioniert.Wie bekomme ich die Position einer Unteransicht einer Tabellenansicht, bevor sie angezeigt wird?

Hier meine Hierarchie ist und was ich versuche zu tun:

//  -> view 
//  -> -> myLabel   //I'd like to have this match center.x with... 
//  -> -> tableView 
//  -> -> -> tableViewCell 
//  -> -> -> -> UIStackView 
//  -> -> -> -> -> mySwitch //...this, before everything appears 

Vorschläge, wie dies zu erreichen? Alle Hilfe wird sehr geschätzt. Vielen Dank!


EDIT: Dieser Code funktioniert auf die Positionierung, aber nicht ausgeführt, bevor es angezeigt wird. Es läuft, wenn eine Zelle erhalten geladen/wiederverwendet hat, so scheint es, zuerst an der falschen Stelle:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    if let cell = tableView.dequeueReusableCellWithIdentifier("myCell") as? myCell { 
     cell.configureCell(myArray[indexPath.row]) 
     let centerPoint = cell.mySwitch.convertPoint(cell.mySwitch.center, toView: self.view) 
     myLabel.center.x = centerPoint.x - (myLabel.frame.width/2) 
     return cell 
    } else { 
     return myCell() 
    } 
} 
+0

Ja, es ist in myCell.swift programmiert (der Controller für die TableViewCell-Unterklasse, die ich verwende) –

+0

Kennen Sie die Position des Schalters in der Zelle? – APesate

+0

Ja, tut mir leid, ich habe vergessen zu erwähnen: Ich war in der Lage, die globale Position des Switches zu bekommen, aber ich weiß nicht, wo der Code implementiert werden soll, der die Position des Labels ändert, bevor es erscheint. Ich werde meine Frage mit dem Code aktualisieren, den ich gefunden habe, und die Stapelansicht, die ich in der Hierarchie weggelassen habe, nur für den Fall –

Antwort

0

ich nicht sicher bin, ich verstehe Ihre Frage, aber man kann versuchen

zu verwenden - (void) tableview: (UITableView *) tableview willDisplayCell: (UITableViewCell *) Zelle forRowAtIndexPath: (NSIndexPath *) indexPath

Sie die zu Zelle verweisen erhalten und verwenden können cell.yourSwitch.frame.origin für Position

+0

Ich habe diese Funktion ausprobiert und meinen Code von oben in den Code eingefügt (beginnend mit der Zeile 'let centerPoint'), aber er wird nicht aufgebaut und sagt: "Wert des Typs 'UITableViewCell' hat kein Mitglied 'mySwitch'". Gibt es eine andere Art und Weise? –

+0

Sie müssen eine benutzerdefinierte Klasse erstellen, die UITableViewCell erweitert, diese Klasse Ihrer Zelle zuweist und dann ein IBOutlet Ihres Switches in Ihrer Zellendefinition erstellt. Dann können Sie mit cell.yourSwitch darauf zugreifen und erhalten so die Positionswerte. –

0

UPDATE: Danke allen für die Hilfe. Für alle Interessierten gab ich auf und nutzte die Größenklassen in Interface Builder, obwohl es idealerweise programmgesteuert wäre (hält die Dinge sauberer IMO, als dass man sie an jede Größenklasse anpassen müsste. Jetzt sind die beiden Elemente sind nicht wirklich aufeinander beschränkt, ich habe sie manuell positioniert). Lassen Sie diese Frage für alle anderen Leser offen, die sie kommentieren oder lesen möchten!

0

Basierend auf Ihre Kommentare ist es das, was Sie tun sollten, (obwohl ich nicht zu empfehlen, weil es die Leistung Ihrer App auswirken wird)

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
{ 
    //Option 1 
    (cell as! MyCell).mySwitch... 

    //Option 2 
    let cell: MyCell = cell as! MyCell 
    cell.mySwitch... 
} 

Aber wenn ich es richtig verstanden und alle Schalter sind so positioniert, an In jeder Zelle müssen Sie nur die gleiche Ebene wie bei der Positionierung der Beschriftung positionieren, damit sie mit den Schaltern ausgerichtet ist, ohne sie tatsächlich miteinander verbinden zu müssen.

+0

Vielen Dank für die Eingabe. Ich möchte sagen, dass ich etwas sehr Ähnliches versucht habe, aber vielleicht hätte es die Art und Weise, wie du die Zelle machst, behoben! Meine Zelle. Ansonsten scheint es ähnlich zu dem, was die andere Person vorgeschlagen hat und was ich versucht habe, aber es würde nicht bauen, sagen, dass "Zelle" nicht "mySwitch" enthielt. So oder so habe ich einfach auf IB zurückgegriffen und manuell dafür gesorgt, dass sie in jeder Größenklasse wie center.x aussehen. Nicht so ideal oder Spaß für mich, da es das Label nicht zukunftssicher macht, aber es hat definitiv seinen Zweck erfüllt. Vielen Dank!! –

+0

P.S. Die App ist kompatibel mit iphone und ipad, weshalb ich es programmatisch machen wollte, wenn Sie meinen Drift fangen haha. –

+0

@ SeanC.Li Wenn Sie Auto-Layout verwenden, haben Sie keine Probleme bei der Anzeige des Bildschirms in einem iPad oder einem iPhone, weil alle ordnungsgemäß nach den Einschränkungen positioniert (deshalb ist es besser Constraints statt Frames zu verwenden, weil es nimmt die ganze Mathematik hinter der Positionierung der Ansichten heraus). Sie könnten sogar die Abhängigkeit ändern, wenn es nötig ist, abhängig vom Gerät, indem Sie 'UIDevice.current() verwenden. UserInterfaceIdiom == (.pad ODER .phone)' Ich hoffe, es hat geholfen und wenn nicht und immer noch versuchen, es zu lösen froh, dass ich Helfen kann. – APesate

Verwandte Themen