Подтвердить что ты не робот

Почему мы не можем напрямую изменить размер или происхождение рамы UIView?

Это может показаться очень глупым для людей, которые это знают, но я совершенно новичок в iOS. Я хотел бы знать, почему мы не можем изменить начало или размер или могут быть x, y или ширина по высоте этих свойств кадра UIView?

frame - это структура CGRect, а начало и размер - снова структуры CGPoint и CGSize. когда мы можем получить к ним доступ, почему мы не можем их изменить?

В CGRect нет ничего подобного, мы можем изменить его атрибуты, поэтому почему бы нам не сделать это для рамки или границ.

4b9b3361

Ответ 1

Я предполагаю, что вы имеете в виду, почему вы не можете сделать что-то вроде этого:

myView.frame.origin.x = 23.0;

Хороший вопрос, ничего глупого. Проблема в том, что кадр сохраняется как свойство представления, а не отдельные компоненты кадра (размер и происхождение, или даже глубже, ширина, длина, х и у).

Фрейм является основополагающим для представления, поэтому есть много действий, которые необходимо сделать для представления, если его фрейм изменен. Если вам нужно было напрямую войти в исходное положение и изменить его, то вы обойдете метод setFrame, где все это волшебство, вероятно, произойдет.

При доступе к view.frame вам предоставляется CGRect с тем же значением, что и view.frame, но на самом деле это не кадр, поэтому любые изменения в нем не влияют на представление.

Вы можете сделать это пошагово:

CGRect frame = view.frame;
frame.origin.x = 23.0;
view.frame = frame;

Ответ 2

Ответ лежит в синтаксисе языка (слегка запутанный):

  • myView - объект Objective-C.
  • Итак, myView.frame - это метод доступа к свойствам, который отправляется.
  • Он возвращает структуру C типа CGRect.
  • frame.origin.x = 1 изменяет возвращенную временную структуру, которая является локальной для вашего кода.

Ваше намерение состояло в том, чтобы сообщить объекту что-то, отправив ему сообщение. Но вместо этого вы попросили объект для данных, а затем изменили эти данные. Теперь объект никогда не будет.

Компилятор должен предупредить вас об этой ошибке.