В чем смысл view.bounds.origin? - PullRequest
       2

В чем смысл view.bounds.origin?

8 голосов
/ 24 октября 2011

скажем, если я установлю view.bounds.origin на (50,50), то подпредставление отрисовывается (50,50) слева для просмотра. Но я подумал, что это должен быть обратный результат, так что означает bounds.origin?

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

subview = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
subview.backgroundColor = [UIColor blueColor];
subview.bounds = CGRectMake(50, 50, 200, 200);

subsubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0,100,100)];
subsubview.backgroundColor = [UIColor yellowColor];
[subview addSubView:subsubView];

это приведет к такому результату: enter image description here

так почему желтый вид там находится?

Ответы [ 5 ]

6 голосов
/ 24 октября 2011

Из документации :

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

То, что вы сделали, изменив bounds, фактически перевели внутреннее координатное пространство subView вниз и вправо на 50 пунктов.Затем вы добавили «subsubView» с началом координат 0,0 в координатном пространстве subView - следовательно, это на 50 точек вверх и слева от видимого начала координат subView.

Есливы установили subView frame вместо bounds, вы бы переместились subView в пределах координатного пространства суперпредставления, поэтому ваш синий квадрат переместился бы вверх и влево, ижелтый квадрат будет содержаться в нем и иметь то же происхождение.

Установка bounds на то, что не имеет источника (0,0), аналогично добавлению перевода в представление.Практически во всех случаях это не то, что вы хотите сделать, и вместо этого вам следует установить свойство frame.Каждое представление в иерархии представлений имеет свое собственное координатное пространство.frame - это то, где представление относится к его суперпредставлению, а bounds - это пространство внутри представления.

Итак, подпредставление frame описывает его местоположение и размер в суперпредставлении bounds.Если bounds суперпредставления имеет ненулевое происхождение, и вы добавляете подпредставление с frame, имеющим нулевое происхождение, оно будет "вне" границ суперпредставления.

3 голосов
/ 06 мая 2014

Проблема в том, что мы обычно думаем, что при изменении начала координат blue view (например, смещение вправо вниз), желтый вид также должен сместиться вправо вниз, так как позиция yellow view относительно его системы координат суперпредставления (в этом случае blue view bounds origin). Это не тот случай

Вместо этого нам следует подумать, что blue view определяет маску, в которой он показывает только часть прямоугольника в своем координатном пространстве. Поэтому, если мы изменим начало координат blue view на правый нижний угол, он просто сместит маску на правый нижний край, и отобразятся только виды внутри этой маски. А для red view это всегда показывает, что маска в фиксированной позиции (blue view начало кадра не меняется). Представьте себе, что red view берет маску blue view и помещает ее в положение, определенное рамкой blue view

Только что нашел это Понимание UIScrollView от Оле, которое очень полезно и объясняет это очень ясно

Я настоятельно рекомендую прочитать это

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

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

enter image description here

1 голос
/ 24 октября 2011

Рамка вашего синего вида по-прежнему 100, 100, 200, 200. Границы 50, 50, 200, 200, но рамка остается неизменной.

Желтый вид добавляется к синему виду,в 0, 0, в пределах, а не в кадре.Таким образом, желтый показывает 50, 50, 50, 50.

Изменение:

subview.bounds = CGRectMake(50, 50, 200, 200);

Кому:

subview.bounds = CGRectMake(100, 100, 200, 200);

и посмотрим, что произойдет.

0 голосов
/ 04 апреля 2016

UIWindow: frame == bounds :: ==> (0, 0, windowWidth, windowHeight)

subview: frame :: ==> (100, 100, 200, 200) в границах UIWindows [UIWindows cordinate space.]

Когда вы делаете это:

subview.bounds = CGRectMake(50, 50, 200, 200);

Вы говорите, что кадр подпредставления подпредставления будет начинаться с (50, 50, 200, 200), если подпредставление этого подпредставления [subsubview] должно было правильно покрывать подпредставление.

Точно так же, как вам нужно указать рамку вашего подпредставления (0,0, windowWidth, windowHeight), чтобы правильно покрыть окно вашим подпредставлением.

Дело в том, что фрейм SUBVIEWS зависит от его непосредственной системы SUPINVIEWS. Локальная / внутренняя сердечная система непосредственного супервизии - это ее границы.

Подходя к вопросу, почему подпредставление вверх и влево на 50 50 баллов.

subview.bounds = CGRectMake(50, 50, 200, 200);

subsubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0,100,100)];

сравнить между (0,0) и (50,50).
Мы сказали, что локальное / внутреннее пространство корвината subview должно быть (50,50, 200, 200) Затем мы добавили подпредставление subview [subsubview] в (0,0) внутри представления subview , которое начинается в (50,50).

В этом случае (0,0) находится слева вверху от (50,50). Вот почему это произошло.

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

0 голосов
/ 24 октября 2011

На экране прямоугольник границ представляет то же самое видимое часть представления в виде прямоугольника рамки. По умолчанию происхождение прямоугольник границ установлен на (0, 0), но вы можете изменить это значение на отображать разные части вида. Размер границ прямоугольник связан с размером прямоугольника кадра, так что изменения одного влияют на другое. Изменение размера границ увеличивается или сжимает вид относительно его центральной точки. Координаты границы прямоугольника всегда указываются в точках.

Из документации UIView .

Обучение Просмотр руководства по программированию также будет полезно.

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