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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

Например, в Landscape 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];

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

введите описание изображения здесь

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

И мы добавляем subviews:

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];

введите описание изображения здесь

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

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

введите описание изображения здесь

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

введите описание изображения здесь

Мы видим, что его subview frame.origin смещен bounds.origin(используя минус, а не плюс).

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

  • view.bounds определяет все его местоположение в subview (offset by bounds.origin), а bounds не будет влиять на его собственное местоположение в своем супервизии.

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

Ответ 3

UIScrollView bounds.origin не будет (0, 0), когда его contentOffset не является (0, 0).

Ответ 4

Ограничение .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

попробуйте сами!