Ich versuche die Funktionen dieser Methoden zu verstehen. Könnten Sie mir einen einfachen Anwendungsfall geben, um ihre Semantik zu verstehen?
In der Dokumentation wird beispielsweise die Methode convertPoint: fromView: wie folgt beschrieben:
Konvertiert einen Punkt aus dem Koordinatensystem einer bestimmten Ansicht in den des Empfängers.
Was bedeutet das Koordinatensystem ? Was ist mit dem Empfänger ?
Ist es beispielsweise sinnvoll, convertPoint: fromView: wie folgt zu verwenden?
CGPoint p = [view1 convertPoint:view1.center fromView:view1];
Mit dem Dienstprogramm NSLog habe ich überprüft, ob der p-Wert mit der Mitte von view1 übereinstimmt.
Vielen Dank im Voraus.
BEARBEITEN: Für Interessenten habe ich ein einfaches Code-Snippet erstellt, um diese Methoden zu verstehen.
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 200)];
view1.backgroundColor = [UIColor redColor];
NSLog(@"view1 frame: %@", NSStringFromCGRect(view1.frame));
NSLog(@"view1 center: %@", NSStringFromCGPoint(view1.center));
CGPoint originInWindowCoordinates = [self.window convertPoint:view1.bounds.origin fromView:view1];
NSLog(@"convertPoint:fromView: %@", NSStringFromCGPoint(originInWindowCoordinates));
CGPoint originInView1Coordinates = [self.window convertPoint:view1.frame.origin toView:view1];
NSLog(@"convertPoint:toView: %@", NSStringFromCGPoint(originInView1Coordinates));
In beiden Fällen ist self.window der Empfänger. Aber es gibt einen Unterschied. Im ersten Fall wird der Parameter convertPoint in view1-Koordinaten ausgedrückt. Die Ausgabe ist die folgende:
convertPoint: fromView: {100, 100}
Im zweiten Fall wird der convertPoint stattdessen in Koordinaten der Übersicht (self.window) ausgedrückt. Die Ausgabe ist die folgende:
convertPoint: toView: {0, 0}
convertPoint
undconvertRect
unterscheiden sich in der Rückgabeart.CGPoint
oderCGRect
. Aber was ist mitfrom
undto
? Gibt es eine Faustregel, die ich verwenden könnte? Danke dir.Ich finde das immer verwirrend, deshalb habe ich einen Spielplatz geschaffen, auf dem Sie visuell erkunden können, was die
convert
Funktion tut. Dies geschieht in Swift 3 und Xcode 8.1b:Denken Sie daran, den Assistenten-Editor ( ⎇⌘⏎) anzuzeigen, damit die Ansichten angezeigt werden. Er sollte folgendermaßen aussehen:
Fühlen Sie sich frei, hier oder in diesem Kern weitere Beispiele beizutragen .
quelle
self.view
redundant sind und einfach verwendet werden können,view
wenn sieself
nicht benötigt werden.self
Hier ist eine Erklärung in einfachem Englisch.
Wenn Sie das Rechteck einer Unteransicht (
aView
ist eine Unteransicht von[aView superview]
) in den Koordinatenraum einer anderen Ansicht (self
) konvertieren möchten .quelle
Jede Ansicht in iOS hat ein Koordinatensystem. Ein Koordinatensystem ähnelt einem Diagramm mit einer x-Achse (horizontale Linie) und einer y-Achse (vertikale Linie). Der Punkt, an dem sich die Linien schneiden, wird als Ursprung bezeichnet. Ein Punkt wird durch (x, y) dargestellt. Zum Beispiel bedeutet (2, 1), dass der Punkt noch 2 Pixel und 1 Pixel nach unten ist.
Weitere Informationen zu Koordinatensystemen finden Sie hier - http://en.wikipedia.org/wiki/Coordinate_system
Was Sie jedoch wissen müssen, ist, dass in iOS jede Ansicht ein EIGENES Koordinatensystem hat, wobei die obere linke Ecke der Ursprung ist. Die X-Achse steigt weiter nach rechts und die Y-Achse weiter nach unten.
Nehmen Sie für die Frage der Konvertierungspunkte dieses Beispiel.
Es gibt eine Ansicht namens V1, die 100 Pixel breit und 100 Pixel hoch ist. Darin befindet sich eine weitere Ansicht namens V2 bei (10, 10, 50, 50), was bedeutet, dass (10, 10) der Punkt im Koordinatensystem von V1 ist, an dem sich die obere linke Ecke von V2 befinden sollte, und ( 50, 50) ist die Breite und Höhe von V2. Nehmen Sie nun einen Punkt in das Koordinatensystem von VIDE V2, z. B. (20, 20). Was wäre dieser Punkt innerhalb des Koordinatensystems von V1? Dafür sind die Methoden gedacht (natürlich können Sie sich selbst berechnen, aber sie sparen Ihnen zusätzliche Arbeit). Für die Aufzeichnung wäre der Punkt in V1 (30, 30).
Hoffe das hilft.
quelle
Vielen Dank, dass Sie die Frage und Ihre Antworten gepostet haben: Es hat mir geholfen, dies zu klären.
Mein View Controller hat seine normale Ansicht.
In dieser Ansicht gibt es eine Reihe von Gruppierungsansichten, die kaum mehr bewirken, als ihren untergeordneten Ansichten eine saubere Interaktion mit Einschränkungen für das automatische Layout zu ermöglichen.
In einer dieser Gruppierungsansichten befindet sich eine Schaltfläche Hinzufügen, die einen Popover-Ansichts-Controller anzeigt, in den der Benutzer einige Informationen eingibt.
Während der Gerätedrehung wird der View Controller über den UIPopoverViewControllerDelegate-Aufruf popoverController: willRepositionPopoverToRect: inView: alarmiert.
Der wesentliche Teil, der sich aus der Erklärung der ersten beiden Antworten oben ergibt, war, dass das Rechteck, aus dem ich konvertieren musste, die Grenzen der Schaltfläche zum Hinzufügen und nicht deren Rahmen waren.
Ich habe dies nicht mit einer komplexeren Ansichtshierarchie versucht, aber ich vermute, dass wir durch die Verwendung der im Methodenaufruf (inView :) bereitgestellten Ansicht die Komplikationen der Hässlichkeit von mehrstufigen Blattansichten umgehen.
quelle
Ich habe diesen Beitrag verwendet, um mich in meinem Fall zu bewerben. Ich hoffe, dies wird einem anderen Leser in Zukunft helfen.
Eine Ansicht kann nur ihre unmittelbaren untergeordneten und übergeordneten Ansichten sehen. Es kann die Ansichten seiner Großeltern oder Enkelkinder nicht sehen.
In meinem Fall habe ich also eine übergeordnete Ansicht namens
self.view
, in derself.view
ich Unteransichten mit dem Namenself.child1OfView
,self.child2OfView
. In habeself.child1OfView
ich Unteransichten mit dem Namenself.child1OfView1
,self.child2OfView1
.Wenn ich mich nun physisch
self.child1OfView1
zu einem Bereich außerhalb der Grenzeself.child1OfView
zu einem anderen Punkt bewegeself.view
, dann um die neue Position für dieself.child1OfView1
innerhalb des zu berechnenself.view:
quelle
Sie können den folgenden Code sehen, damit Sie verstehen, wie er tatsächlich funktioniert.
quelle
Ich lese die Antwort und verstehe die Mechanik, aber ich denke, das letzte Beispiel ist nicht korrekt. Gemäß dem API-Dokument enthält die Eigenschaft center einer Ansicht den bekannten Mittelpunkt der Ansicht im Koordinatensystem der Übersicht.
Wenn dies der Fall ist, wäre es meines Erachtens nicht sinnvoll, die Übersicht zu bitten, die Mitte einer Unteransicht aus dem Unteransichtskoordinatensystem zu konvertieren, da sich der Wert nicht im Unteransichtskoordinatensystem befindet. Sinnvoll wäre es, das Gegenteil zu tun, dh vom Superview-Koordinatensystem in das einer Unteransicht zu konvertieren ...
Sie können dies auf zwei Arten tun (beide sollten den gleichen Wert ergeben):
oder
Bin ich weit davon entfernt zu verstehen, wie das funktionieren soll?
quelle
Ein weiterer wichtiger Punkt bei der Verwendung dieser APIs. Stellen Sie sicher, dass die übergeordnete Ansichtskette zwischen dem zu konvertierenden Rechteck und der Ansicht von / nach vollständig ist. Zum Beispiel - aView, bView und cView -
Wenn wir versuchen, die Methode auszuführen, bevor bView als Unteransicht von cView hinzugefügt wurde, erhalten wir eine Bunk-Antwort zurück. Leider ist in den Methoden für diesen Fall kein Schutz eingebaut. Dies mag offensichtlich erscheinen, ist jedoch in Fällen zu beachten, in denen die Bekehrung eine lange Kette von Eltern durchläuft.
quelle