2013-05-02 12 views
12

Sto provando a impostare l'origine del frame a livello di programmazione.Impostazione dell'origine del frame in iOS

Method1:

button.frame.origin.y = 100; 

Metodo 2:

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

Ho provato il metodo 1 ma non funziona (mostrando un dicendo Expression errore non è assegnabile). Il metodo 2 sta funzionando. Perché è così?

Ho bisogno di indicazioni su ciò che sto facendo bene.

+0

Come dice l'errore: le proprietà del frame di una vista non sono assegnabili. Solo il frame stesso è assegnabile. Quindi devi semplicemente attenersi al metodo # 2. –

+0

quindi solo il metodo 2? altri metodi? – lakesh

+1

per un UIView, frame (CGRect) è R/W e 'frame.origin' è readonly. – samfisher

risposta

25

Il motivo per cui non è possibile eseguire il metodo # 1 è perché le proprietà individuali di un frame sono di sola lettura. Tuttavia, l'intero frame stesso è scrivibile/assegnabile, quindi puoi eseguire il metodo # 2.

Si può anche fare i trucchi come questo:

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

Si conosce button.frame.origin.y restituire un valore.

se si utilizza questo modo si otterrà questo errore ...

espressione non è cedibile.

button.frame.origin.y = 100; 

Quindi questo è corretto modo

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

altrimenti si può fare in questo modo ...

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

solo il metodo 2 quindi? – lakesh

+0

Sì .. altri saggi che puoi fare in questo modo. button.frame = CGRectMake (button.frame.origin.x, 100, button.frame.size.width, button.frame.size.height) –

1

E 'perché se tu fossi in grado di modificare direttamente l'origine o la dimensione di una cornice , ignoreresti il ​​metodo setter della proprietà frame di UIView. Questo sarebbe male per molteplici ragioni.

UIView non ha alcuna possibilità di ricevere notifiche relative alle modifiche apportate al frame. Ma deve sapere su questi cambiamenti per essere in grado di aggiornare le sue sottoview o ridisegnare se stesso.

0
button.frame.origin.y = 100; 

uguale alla seguente chiamata:

[button getFrame].origin.y = 100; 

in cui [button getFrame] la copiato CGRect dà.

Si sta tentando di impostare una variabile di una struttura di una struttura. Non c'è alcun puntatore da UIView alla struttura (in quanto è un valore base C struct quindi non può essere puntato). quindi, copiato, invece.

Quindi, in pratica, si copia la struttura e la si imposta. Ma questo non funziona così.

+0

Hai provato il tuo codice? – ManuQiao

+0

Non sicuro ... Quasi 4 anni risposta. Qual è il problema? – viral

+0

In breve, questa riga di errore di compilazione dei corsi di codice. Ma ancora non capisco che la proprietà non è di sola lettura. Ho trovato questo thread che potrebbe risolvere la mia confusione. http://stackoverflow.com/questions/9411429/why-cant-we-directly-change-size-or-origin-of-a-uiview-frame – ManuQiao

Problemi correlati