2013-05-02 10 views
12

Próbuję programowo ustalić początek ramki.Ustawianie początku ramki w systemie iOS

Method1:

button.frame.origin.y = 100; 

Metoda 2:

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

Próbowałem metody 1, ale to nie działa (wykazujące błędzie wyrażenie nie jest przypisane). Metoda 2 działa. Dlaczego tak jest?

Potrzebujesz wskazówek na temat tego, co robię dobrze.

+0

Jak informuje błąd - Właściwości ramki widoku nie są przypisywane. Można przypisać tylko samą ramkę. Musisz więc trzymać się metody # 2. –

+0

więc tylko metoda 2? jakiekolwiek inne metody? – lakesh

+1

dla UIView, ramka (CGRect) to R/W i 'frame.origin' jest tylko do odczytu. – samfisher

Odpowiedz

25

Powodem, dla którego nie można wykonać metody nr 1, jest fakt, że poszczególne właściwości ramki są tylko do odczytu. Jednak cała sama ramka jest zapisywalna/możliwa do przypisania, więc możesz zrobić metodę # 2.

Można nawet robić sztuczki tak:

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

Znasz button.frame.origin.y zwrócić wartość.

jeśli używasz tego jednego tak otrzymasz ten błąd ...

Expression nie jest przypisane.

button.frame.origin.y = 100; 

Więc to jest poprawny sposób

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

przeciwnym razie można zrobić tak ...

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

tylko metoda 2, a następnie? – lakesh

+0

Tak, poza tym możesz tak postąpić. button.frame = CGRectMake (button.frame.origin.x, 100, button.frame.size.width, button.frame.size.height) –

1

To dlatego, jeśli były w stanie bezpośrednio zmienić pochodzenie lub wielkość ramie za , pominiesz metodę ustawiającą właściwości ramki UIView. Byłoby to złe z wielu powodów.

UIView nie miałby szansy zostać powiadomiony o zmianach w jego ramce. Musi jednak wiedzieć o tych zmianach, aby móc zaktualizować swoje subviews lub przerysować sam siebie.

0
button.frame.origin.y = 100; 

równa następującej rozmowy:

[button getFrame].origin.y = 100; 

w którym [button getFrame] daje skopiowany CGRect.

Próbujesz ustawić zmienną struktury struktury. Nie ma wskaźnika od UIView do struktury (ponieważ jest to podstawa C struct, więc nie można go wskazać). dlatego zamiast tego skopiowano.

W zasadzie kopiujesz strukturę i ustawiasz ją. Ale to po prostu nie działa w ten sposób.

+0

Czy próbowałeś swojego kodu? – ManuQiao

+0

Nie jestem pewien ... Prawie 4 lata. W czym problem? – viral

+0

W skrócie, ten błąd kompilacji kursów linii kodu. Ale nadal nie rozumiem, że nieruchomość nie jest tylko do odczytu. Znalazłem ten wątek, który może rozwiązać moje zamieszanie. http://stackoverflow.com/questions/9411429/why-cant-we-directly-change-size-or-origin-of-a-viewview-frame – ManuQiao

Powiązane problemy