Установка frame.size с помощью оператора точки - PullRequest
2 голосов
/ 13 декабря 2010

У меня есть UIController, и, как вы все знаете, UIController связан с представлением, и вы можете получить к нему доступ, используя методы получения и установки, которые синтезируются

UIController controller = init code ..

.. controller.view ->это дает мне мой UIView объект, который был сохранен и автоматически освобожден, это будет синтезированный метод get (если вообще мое синтезированное getmethod понимает правильно)

controller.view.frame -> this gives me my CGRect struct

controller.view.frame.size -> CGSize struct

почему я не могу присвоить значение непосредственно этой структуре кадра

controller.view.frame.size.width = 20;

для приведенного выше утверждения я получаю эту ошибку "lvalue требуется в качестве левого операнда присваивания"

Это нормальный оператор c, я думаю, он должен работать.ничего не хватает

Ответы [ 3 ]

7 голосов
/ 13 декабря 2010

Использование оператора точки в этой ситуации означает использование метода получения frame за кадром. Поскольку свойство frame - это CGRect, представляющее собой простую структуру C, frame возвращает вам копию значения, а не указатель на значение. Изменение этого параметра приведет к изменению CGRect, который вы скопировали локально в стеке, а не CGRect свойства frame вашего представления. Чтобы обновить фактическое свойство фрейма, вы должны выполнить метод установки [yourView setFrame:yourNewFrame]; или yourView.frame = yourNewFrame;.

1 голос
/ 13 декабря 2010

проще всего решить, это снова установить весь кадр

controller.view.frame = CGRectMake(controller.view.frame.origin.x, controller.view.frame.origin.y, 20, controller.view.frame.size.height);

причина, по которой это не работает напрямую, описана в ссылке Джеймса, в ней есть только геттеры.

0 голосов
/ 13 декабря 2010

Синтаксис точки является просто синтаксическим сахаром.

В данном случае этот код:

controller.view.frame.size.width = 20;

На самом деле это код:

[[controller view] frame].size.width = 20;

В терминах Cэто так:

ViewGetFrame(ControllerGetView(controller)).size.width = 20;

Суть в том, что вы не можете таким образом установить подполе результата функции.И даже если бы вы могли, это не повлияло бы на оригинал, а только на копию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...