Причина, по которой это не работает, заключается в смешении двух синтаксисов.
Сначала у вас есть "."в качестве ярлыка для вызова функций доступа (функция Objective-C).Таким образом,
- ab становится [a getB];
- ab = 5 становится [setB: 5];
И затем появляется "."как прямой доступ к элементу структуры (чистый C).Таким образом,
- ab на самом деле является ab;
- ab на самом деле является ab = 5;
Объединение этого в случае набора значений, как это, не делаетне работает.
Потому что ... Если бы вы могли вызвать
myView.frame.origin.x = 25.0;
Часть "myView.frame" равна [myView getFrame], и вы получите скопированный кадр CGRect (структура C)
«myView.frame.origin» дает вам источник CGPoint (также структура) скопированного CGRect
«MyView.frame.origin.x = 25.0» дает вам CGFloat x источника, и теперь вы хотите присвоить ему что-то, и здесь возникает проблема ...
Выпопробуйте установить переменную структуры структуры, что нормально, но нет указателя от UIView на структуру, поэтому вместо этого она копируется.Таким образом, вы копируете, а затем устанавливаете, а затем ожидаете, что действие set каким-то образом перенаправляется через начальный переход к UIView, и это просто не работает.
Конечно, вы могли бы задаться вопросом, почему Apple не просто создала ярлык, так что в итоге ваш скопированный кадр автоматически повторно вводится в автоматически добавленный вызов setFrame, я думаю, вам просто нужно жить с тем, как оно есть.
Запомните, это сработало бы, если бы вы получили указатель на фрейм, но не получили, вместо этого вы получите скопированную структуру.
Так что, если вы ожидаете, что myView.frame.origin.x = 25.0
сработает, выкосвенно ожидать, что ваш вызов будет автоматически переведен в какой-то тип
[myView setFrame:[myView getFrame:frame].origin.x = 25.0]
.
Ну, я думаю, вы можете допустить, что это выглядит неправильно.
Также представьте, если вы получите прямой указатель накадр CGRect, и вы бы что-то изменили с помощью этого указателя, как бы UIView узнал, что его размер изменился и что он должен сам обновиться?Если, с другой стороны, выполняется вызов [myView setFrame: newFrame], тогда UIView может сам выполнить всю необходимую перенастройку.