Когда UIView's bounds.origin не будет (0, 0)? - PullRequest
33 голосов
/ 10 декабря 2011

Когда UIView's bounds.origin не будет (0, 0)?

Этот пост был полезен для меня:

ВАЖНО !! Границы X и Y, источник, предназначены для перемещения внутри Посмотреть. Для примера X + 5, перемещение 5 пикселей слева от начала кадра то есть рисовать весь контент в этом представлении слева 5 пикселей от фреймов происхождение. Это ничего не делает для себя, это то, что нарисовано на нем которые страдают.

Но он описывает только тот случай, когда я сам установил значение bounds.origin.
В каких других случаях значение bounds.origin != (0, 0)?

Ответы [ 4 ]

28 голосов
/ 16 августа 2015

Рамка просмотра определяет его местоположение в суперпредставлении .Границы представления определяют его местоположения подпредставлений .Это означает, что если вы измените границы вида, его местоположение не изменится, но изменится местоположение всех его подвидов.

Положительные ширина и высота аналогичны тому, как вы рисуете вид сверху-слева-снизу.вправо, в то время как отрицательное значение от нижнего правого до верхнего левого.Так что

frame1 = CGRectMake(100, 100, -50, -50) 

полностью совпадает с

frame2 = CGRectMake(50, 50, 50, 50). 

И фактически, если вы инициируете представление с frame1, оно будет АВТОМАТИЧЕСКИ ИЗМЕНЕНО на frame2.

Но bounds.origin взглядов не идентичны.Bounds.origin указывает точку, в которой вы «рисуете» вид, поэтому все кадры подпредставлений будут возникать в этой точке.

Например, в альбоме iPhone 6 с ландшафтом имеем:

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 275, 275)];
leftView.backgroundColor = [UIColor greenColor];
[self.view addSubview:leftView];

UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(667-50, 375-50, -275, -275)];
rightView.backgroundColor = [UIColor blueColor];
[self.view addSubview:rightView];

И мы получили:

enter image description here

Мы обнаружим, что кадр rightView автоматически меняется на положительное значение, которое (342, 50, 275, 275),но его bounts.origin = (-275,-275).

И мы добавляем подпредставления:

UIView *leftSubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
leftSubview.backgroundColor = [UIColor grayColor];
[leftView addSubview:leftSubview];
UIView *rightSubview= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
rightSubview.backgroundColor = [UIColor grayColor];
[rightView addSubview:rightSubview];

enter image description here

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

Если мы изменим границы rightView равным leftView: rightView.bounds = leftView.bounds;Тогда расположение двух subViews одинаково, мы потеряли информацию о том, что ширина и высота rightView отрицательны.

enter image description here

И вместо этого мы изменим границы leftViewof rightView: CGRect bounds = leftView.bounds;bounds.origin = CGPointMake (50, 50);leftView.bounds = bounds;

enter image description here

Как видим, frame.origin его подпредставления смещен на bounds.origin (используется минус, а не плюс).

В заключение:

  1. view.bounds определяет местоположение всего своего подпредставления (смещение на bounds.origin), тогда как bounds не повлияет на его собственное местоположение в суперпредставлении.

  2. Если вы инициируете представление с отрицательной шириной и высотой, оно автоматически изменится на положительное (что не изменит местоположение), но его bounds.origin указывает точку, которую выначать "рисовать" вид.

23 голосов
/ 10 декабря 2012

UDScrollView's bounds.origin не будет (0, 0), если его contentOffset не равно (0, 0).

16 голосов
/ 14 марта 2012

Bounds.origin будет отрицательным, если вы инициализируете представление с отрицательной шириной / высотой. Например, если вы сделали

UIView* v = [[UIView alloc] initWithFrame:CGRectMake(5, 5, -10, -20)];

кадр будет:

origin = {
  x = -5, 
  y = -15
}, 
size = {
  width = 10, 
  height = 20
}

оценка:

origin = {
  x = -10, 
  y = -20
}, 
size = {
  width = 10, 
  height = 20
}

центр:

x = 0, 
y = -5

Попробуй сам!

0 голосов
/ 10 декабря 2011

(отредактировано еще раз, потому что я не могу удалить свой первоначальный ответ после его принятия - заслуга в этом принадлежит Иану, который опубликовал более подробный ответ ниже:)

В большинстве случаев этого не произойдет,Если вы инициализируете свой вид с отрицательной шириной и / или высотой, вы получите исходную точку с отрицательным X ширины и / или отрицательным Y высоты.

...