2013-05-02 5 views
12

einstellen Ich versuche, den Ursprung des Frames programmgesteuert festzulegen.Den Ursprung des Frames in iOS

Method1:

button.frame.origin.y = 100; 

Methode 2:

CGRect frame = button.frame; 
frame.origin.y = 100; 

ich versuchte, Methode 1, aber es funktioniert nicht (eine Fehlermeldung, Ausdruck darstellt, ist nicht belegbar). Methode 2 funktioniert. Warum ist das so?

Brauchen Sie Anleitung, was ich richtig mache.

+0

Wie der Fehler sagt - Die Rahmeneigenschaften einer Ansicht sind nicht zuweisbar. Nur der Rahmen selbst ist zuweisbar. Sie müssen also einfach bei Methode 2 bleiben. –

+0

also nur Methode 2? irgendwelche anderen Methoden? – lakesh

+1

für eine UIView, Frame (CGRect) ist R/W und "frame.origin" wird nur gelesen. – samfisher

Antwort

25

Der Grund, warum Methode 1 nicht möglich ist, liegt darin, dass die einzelnen Eigenschaften eines Frames schreibgeschützt sind. Der gesamte Rahmen selbst ist schreibbar/zuweisbar, so dass Sie Methode 2 durchführen können.

Sie können sogar Tricks, wie dies tun:

CGRect newFrame = button.frame; 
newFrame.origin.y += 100; // add 100 to y's current value 
button.frame = newFrame; 
3

Sie wissen button.frame.origin.y geben Sie einen Wert zurück.

, wenn Sie diese ein verwenden, so dass Sie diese Fehlermeldung erhalten ...

Expression ist nicht übertragbar.

button.frame.origin.y = 100; 

Das ist also richtige Weg

CGRect frame = button.frame; 
frame.origin.y = 100; 

sonst kann man so machen ...

button.frame = CGRectMake(button.frame.origin.x, 100, button.frame.size.width, button.frame.size.height) 
+0

nur Methode 2 dann? – lakesh

+0

Ja .. anders kann man das so machen. button.frame = CGRectMake (button.frame.origin.x, 100, button.frame.size.width, button.frame.size.height) –

1

Es ist, weil, wenn Sie in der Lage waren direkt einen Rahmen der Herkunft oder der Größe zu ändern , würden Sie die Setter-Methode der UIView-Frame-Eigenschaft umgehen. Dies wäre aus mehreren Gründen schlecht.

UIView hätte keine Chance, über Änderungen an seinem Frame benachrichtigt zu werden. Aber es muss über diese Änderungen Bescheid wissen, um die Subviews aktualisieren oder neu zeichnen zu können.

0
button.frame.origin.y = 100; 

entspricht dem folgenden Aufruf:

[button getFrame].origin.y = 100; 

, in dem [button getFrame] gibt Ihnen die kopierte CGRect.

Sie versuchen, eine Variable einer Struktur einer Struktur festzulegen. Es gibt keinen Zeiger von der UIView auf die Struktur (wie es eine grundlegende C struct ist, so kann nicht darauf hingewiesen werden). daher stattdessen kopiert.

Im Grunde kopieren Sie die Struktur und legen sie fest. Aber das funktioniert einfach nicht so.

+0

Haben Sie Ihren Code getestet? – ManuQiao

+0

Nicht sicher ... Fast 4 Jahre alt antworten. Was ist das Problem? – viral

+0

Kurz gesagt, diese Codezeile führt zu einem Kompilierungsfehler. Aber ich verstehe immer noch nicht, dass die Immobilie nicht gelesen wird. Ich habe diesen Thread gefunden, der meine Verwirrung lösen kann. http://stackoverflow.com/questions/9411429/why-cant-we-directly-change-size-or-origin-of-a-uiview-frame – ManuQiao