2013-05-02 4 views
12

Я пытаюсь установить начало кадра программным путем.Установка источника кадра в iOS

Method1:

button.frame.origin.y = 100; 

Метод 2:

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

Я попробовал метод 1, но он не работает (показывающей говоря Expression об ошибке не переназначить). Способ 2 работает. Почему это так?

Нужно руководствоваться тем, что я делаю правильно.

+0

Как говорится в ошибке: свойства кадра представления не могут быть назначены. Назначается только сам кадр. Поэтому вам просто нужно придерживаться метода # 2. –

+0

поэтому только способ 2? любые другие методы? – lakesh

+1

для UIView, frame (CGRect) - это R/W, а 'frame.origin' - только для чтения. – samfisher

ответ

25

Причина, по которой вы не можете сделать метод # 1, состоит в том, что индивидуальные свойства фрейма доступны только для чтения. Тем не менее, весь кадр сам записывается/присваивается, поэтому вы можете сделать метод # 2.

Вы даже можете делать трюки, как это:

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

Вы знаете button.frame.origin.y вернуть значение.

, если вы используете этот, так что вы получите эту ошибку ...

Выражение не может быть назначен.

button.frame.origin.y = 100; 

Так что это правильный путь

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

иначе вы можете сделать, как это ...

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

только метод 2, то? – lakesh

+0

Да .. другим мудрым вы можете это сделать. button.frame = CGRectMake (button.frame.origin.x, 100, button.frame.size.width, button.frame.size.height) –

1

Это потому, что если бы вы были в состоянии непосредственно изменить происхождение или размер фрейма , вы обойдете метод setter свойства рамки UIView. Это было бы плохо по нескольким причинам.

UIView не имеет права получать уведомления об изменениях в его раме. Но он должен знать об этих изменениях, чтобы иметь возможность обновлять его подвид или перерисовывать.

0
button.frame.origin.y = 100; 

равна следующему вызову:

[button getFrame].origin.y = 100; 

, в котором [button getFrame] дает скопированное CGRect.

Вы пытаетесь установить переменную структуры структуры. Нет указателя от UIView к структуре (так как это базовый C struct, поэтому нельзя указать). следовательно, скопировали вместо этого.

Итак, вы копируете структуру и устанавливаете ее. Но это просто не работает.

+0

Вы попробовали свой код? – ManuQiao

+0

Не уверен ... Почти 4 года ответит. В чем проблема? – viral

+0

Короче говоря, эта строка ошибки компиляции кода. Но я до сих пор не понимаю, что свойство не только для чтения. Я нашел эту тему, которая может решить мою путаницу. http://stackoverflow.com/questions/9411429/why-cant-we-directly-change-size-or-origin-of-a-uiview-frame – ManuQiao

Смежные вопросы