Рамка просмотра определяет его местоположение в суперпредставлении .Границы представления определяют его местоположения подпредставлений .Это означает, что если вы измените границы вида, его местоположение не изменится, но изменится местоположение всех его подвидов.
Положительные ширина и высота аналогичны тому, как вы рисуете вид сверху-слева-снизу.вправо, в то время как отрицательное значение от нижнего правого до верхнего левого.Так что
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];
И мы получили:
Мы обнаружим, что кадр 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];
Таким образом, границы позволяют подвиду rightView следовать источникукоторый мы запускаем rightView.
Если мы изменим границы rightView равным leftView: rightView.bounds = leftView.bounds;Тогда расположение двух subViews одинаково, мы потеряли информацию о том, что ширина и высота rightView отрицательны.
И вместо этого мы изменим границы leftViewof rightView: CGRect bounds = leftView.bounds;bounds.origin = CGPointMake (50, 50);leftView.bounds = bounds;
Как видим, frame.origin его подпредставления смещен на bounds.origin (используется минус, а не плюс).
В заключение:
view.bounds
определяет местоположение всего своего подпредставления (смещение на bounds.origin), тогда как bounds
не повлияет на его собственное местоположение в суперпредставлении.
Если вы инициируете представление с отрицательной шириной и высотой, оно автоматически изменится на положительное (что не изменит местоположение), но его bounds.origin указывает точку, которую выначать "рисовать" вид.