Установка источника кадра в iOS

Я пытаюсь установить происхождение кадра программно.

Method1:

button.frame.origin.y = 100;

Способ 2:

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

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

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

Ответ 1

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

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

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

Ответ 2

Ты знаешь 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)

Ответ 3

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

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

Ответ 4

button.frame.origin.y = 100;

соответствует следующему вызову:

[button getFrame].origin.y = 100;

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

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

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