Wie setze ich die Ursprungsreferenz eines UIView?

Ich erstelle eine UIImageView und füge sie meiner Ansicht in einer Schleife hinzu. Ich setze den Anfangsrahmen auf 0,0,1,47 und ändere bei jedem Durchgang der Schleife die Mitte der Bildansicht, um sie zu entfernen.

Ich benutze immer 0 als origin.y

Das Problem ist, dass sich die Ursprungsreferenz in der Mitte der Bildansicht befindet, vorausgesetzt, wir befanden uns im Interface Builder. Dies entspricht dem folgenden Bild.

Wie kann ich den Referenzpunkt im Code ändern?

 Daniel07. Jan. 2013, 21:01
Ja, aber der Punkt warHow can I change the reference point in code ?
 Christian Schnorr04. Apr. 2012, 16:06
Kannst du nicht einfach das rote Ding in IB bewegen?

Antworten auf die Frage(3)

müssen Sie den Rahmen der Bildansicht festlegen, die Sie verschieben möchten. Dies kann in dem einfachen Fall so gemacht werden:

<code>_theImageView.frame = CGRectMake(x, y, width, height);
</code>

Natürlich müssen Sie x, y, width und height selbst einstellen. Beachten Sie auch, dass der Rahmen einer Ansicht auf die übergeordnete Ansicht verweist. Wenn Sie also eine Ansicht haben, die sich in der oberen linken Ecke befindet (x = 0, y = 0), 320 Punkte breit und 400 Punkte hoch ist, und den Rahmen der Bildansicht auf (10, 50, 100, 50) und fügen Sie es dann als Unteransicht der vorherigen Ansicht hinzu. Es befindet sich bei x = 10, y = 50 des Koordinatenraums der übergeordneten Ansicht, obwohl die Grenzen der Bildansicht x = 0, y = 0 sind Grenzen beziehen sich auf die Ansicht selbst, Rahmen auf die übergeordnete Ansicht.

In Ihrem Szenario könnte Ihr Code also ungefähr so ​​aussehen:

<code>CGRect currentFrame = _theImageView.frame;
currentFrame.origin.x = 0;
currentFrame.origin.y = 0;
_theImageView.frame = currentFrame;

[_parentView addSubview:_theImageView];
</code>

Alternativ können Sie sagen:

<code>CGRect currentFrame = _theImageView.frame;
_theImageView.frame = CGRectMake(0, 0, currentFrame.size.width, currentFrame.size.height);

[_parentView addSubview:_theImageView];
</code>

Bei beiden Methoden wird die Bildansicht oben links von dem übergeordneten Element festgelegt, zu dem Sie sie hinzufügen.

 jmstone61704. Apr. 2012, 16:02
Wie ich oben erklärt habe, müssten Sie nur das x und y der Bildansicht auf 0, 0 setzen. Dadurch wird es auf 0, 0 der übergeordneten Ansicht gesetzt.
 Dhammini F.31. Juli 2015, 05:26
Danke jmstone. Das hat in meinem Fall geholfen.
 Daniel05. Okt. 2012, 21:59
Was ich wirklich brauchte, war, den Ursprung meiner Ansicht auf einen bekannten Punkt zu setzen, ohne mir Gedanken über die Größe der Ansicht zu machen.
 Daniel04. Apr. 2012, 16:00
Hallo, das Problem ist, dass der Ursprungspunkt auf den absoluten Mittelpunkt dieser Ansicht eingestellt ist. Ich muss ihn ändern, damit er oben links ist.
Lösung für das Problem

bin ich mir nicht sicher, worum es Ihnen geht.

MitUIView Sie können die Position auf zwei Arten einstellen:

center - Es sagt definitiv, dass es das Zentrum ist.frame.origin - Linke obere Ecke, kann nicht direkt eingestellt werden.

Wenn Sie möchten, dass die untere linke Ecke bei x = 300, y = 300 liegt, können Sie dies einfach tun:

<code>UIView *view = ...
CGRect frame = view.frame;
frame.origin.x = 300 - frame.size.width;
frame.origin.y = 300 - frame.size.height;
view.frame = frame;
</code>

Aber wenn Sie eine Ebene tiefer in die magische Welt von gehenCALayers (Vergiss nicht, QuartzCore zu importieren), du bist mächtiger.

CALayer hat diese:

position - Sie sehen, es sagt nicht explizit "Zentrum", also kann es nicht Zentrum sein!anchorPointCGPoint mit Werten im Bereich 0..1 (einschließlich), der den Punkt angibtInnerhalb die Aussicht. Die Standardeinstellung ist x = 0,5, y = 0,5, was "Mitte" bedeutet (und-[UIView center] nimmt diesen Wert an). Sie können einen anderen Wert einstellen und dieposition Eigenschaft wird auf diesen Punkt angewendet.

Beispiel Zeit:

Sie haben eine Ansicht mit der Größe 100x100view.layer.anchorPoint = CGPointMake(1, 1);view.layer.position = CGPointMake(300, 300);Die linke obere Ecke der Ansicht befindet sich bei x = 200, y = 200 und die rechte untere Ecke bei x = 300, y = 300.

Hinweis: Wenn Sie die Ebene / Ansicht drehen, wird sie um das Symbol gedrehtanchorPoint, das ist standardmäßig die Mitte.

Bu da fragst du einfachWIE etwas Bestimmtes tun und nichtWAS du erreichen willst, ich kann dir jetzt nicht weiter helfen.

 n1317. Aug. 2015, 05:08
anchorPoint ist pure Magie, vielen Dank dafür! Bei einem etwas anderen Problem skalierte ich Ansichten, die unten verankert sind. Die Eigenschaft anchorPoint hat dies zu einem absoluten Problem gemacht - etwa 20 Codezeilen wurden entfernt ...
 Tricertops16. Jan. 2013, 10:17
Sie können leicht eine Cetagory erstellenUIView mit Eigenschaften wieframeBorderLeft oderframeOrigin und implementieren Sie diese Accessoren manuell. Dann hast du es leichter.
 Daniel07. Jan. 2013, 21:01
Ich erinnere mich, dass der springende Punkt für eine einfachere und schnellere Möglichkeit war, eine Unteransicht nach rechts auszurichten, indem der Ursprung auf die rechte Mitte gesetzt und der Wert dann der Breite des übergeordneten Elements zugewiesen wurde. Dies bedeutet, dass die Notwendigkeit, die Breite abzüglich der Kindbreite usw usw zu berechnen, umgangen wird
 Daniel07. Jan. 2013, 04:05
Ich war sehr verwirrt, als ich das fragte. Kurz gesagt, mit der IB-Funktion von Xcode können Sie die Metriken einer UIView mit einem hilfreichen Bedienfeld festlegen, indem Sie die Pixelwerte festlegen, aber Sie können auch den Bezugspunkt von Mitte zu Mitte oben, rechts oben, links unten usw. ändern. und das ließ mich denken, dass ich das irgendwie im Code tun könnte, aber es war nur eine Benutzeroberfläche, die hilfreich war, wenn nicht verwirrend, zusätzlich zu Apples Xcode ...

können es mit etwas ändern:

<code>CGRect frame = self.imageView.frame;
frame.origin.y = 0.0f;
self.imageView.frame = frame;
</code>
 Leito05. Okt. 2012, 18:23
@ Daniel hast du das als gelöst markiert? Ich glaube nicht, dass es Ihre Frage beantwortet. Haben Sie schon eine Lösung gefunden?
 Daniel05. Okt. 2012, 20:46
Sie haben das gleiche Problem? Das liegt daran, dass der Interface Builder von Xcode das Layout der Dinge nur visuell vereinfacht. Eigentlich ist der Ursprung das Zentrum ...
 Daniel04. Apr. 2012, 15:58
Hallo, die Frage ist nicht so sehr, wie man den Rahmen ändert, sondern wie man den Bezugspunkt des Ursprungs ändert. Die aktuelle Einstellung von y = 0 bedeutet, dass der Mittelpunkt der Ansicht auf y = 0 und nicht auf den oberen Rand gesetzt wird
 Phillip Mills04. Apr. 2012, 16:08
Wenn du Ursprung sagst, über welchen Ursprung sprichst du? Der Ursprung des Rahmens ist die Position seiner Oberseite in der Übersicht. Es gibt eine 'center'-Eigenschaft für eine Ansicht, aber ich kenne keinen beweglichen Referenzpunkt in einer Ansicht.
 Daniel11. Apr. 2012, 01:36
Ursprung ist wahrscheinlich nicht das beste Wort, um zu beschreiben, was ich meine. Sie sehen in IB, Sie können den Ursprungsbezugspunkt von oben links ändern, um "Mitte" oder "Mitte unten" oder "Mitte rechts" zu sagen ... siehe das angehängte Bild. Nun, ich habe eine Codeansicht hinzugefügt und wollte den Ursprung (die Koordinaten) oben in der übergeordneten Ansicht festlegen. Sagen wir also, ich hätte y = 0. Es scheint jedoch, dass der Ursprungsreferenzpunkt meiner Ansicht nicht links oben als Standard festgelegt ist, sondern in der Mitte (siehe Bild). Wenn ich also y = 0 setze, zeigt die Ansicht nur die untere Hälfte, da die Mitte dieser Ansicht auf y = 0 gesetzt ist

Ihre Antwort auf die Frage