Установка источника кадра в 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
, поэтому нельзя указать). следовательно, скопировали вместо этого.
Таким образом, вы копируете структуру и устанавливаете ее. Но это просто не работает.