我有一堆问题:
- 如何定位 UIView 使其位于要添加到的视图的底部?
- 如何将子视图添加到视图中,使其位于超级视图的角落并留有小间隙(例如,如果我想要一个“x”十字符号来关闭某些东西)
- 它们是用于轻松 UIView 定位(和旋转)的实用程序类吗?
任何参考资料、开源教程等都将受到欢迎!
(a) 如何定位 UIView 使其位于要添加到的视图的底部?
好的,假设您想定位button
为视图底部的子视图form
,您可以通过从按钮的高度中减去按钮的高度来计算origin.y
子视图的button
form
CGRect buttonFrame = button.frame;
buttonFrame.origin.y = form.bounds.size.height - buttonFrame.size.height;
button.frame = buttonFrame;
[form addSubview:button];
您也可以更改原点水平位置。你想要它在左下角form
吗?
buttonFrame.origin.x = 0;
还是在右边form
?
buttonFrame.origin.x = form.bounds.size.width - buttonFrame.size.width;
还是在中间(水平)form
?
buttonFrame.origin.x = (form.bounds.size.width - buttonFrame.size.width) / 2;
或另一种使用方式CGRectGetMidX
(在CGGeometry 实用方法中找到):
buttonFrame.origin.x = CGRectGetMidX(form.bounds) - buttonFrame.size.width/2;
当父视图的大小发生变化时,自动调整大小处理调整框架。但是您仍然必须先定位它。
int xOffset = 20;
int yOffset = 20;
CGRect BottomRight_NewFrame = CGRectMake((superview.frame.size.width - subview.frame.size.width-xOffset), (superview.frame.size.height - subview.frame.size.height-yOffset), subview.frame.size.width, subview.frame.size.height);
subview.frame = BottomFrame;
您可以使用 iOS 6 的新 Autolayout 功能或 Interface Builder 中的旧 Struts & Springs 来实现此目的。
本教程解释了这两个: http: //msmvps.com/blogs/kevinmcneish/archive/2012/12/10/tutorial-ios-6-auto-layout-versus-springs-and-struts.aspx
或者您可以以编程方式设置自动调整大小的掩码。这里解释得很好: UIView autoresizingMask - Interface Builder to Code - Programmatically create struts and springs - Swift or Objective-C
设置框架很容易,例如(未经测试的代码)
subview.frame = CGRectMake((superview.frame.origin.x - subview.frame.origin.size.width/2)-20, (superview.view.frame.origin.y - subview.frame.origin.size.height/2)-20, subview.view.frame.size.width, subview.view.frame.size.height);
如果你会做很多这样的事情,那么创建一个实用程序类或方法。
如果超级视图的大小发生变化,自动布局将帮助您定位视图并保持这些位置。如果超级视图不会改变,你真的不需要弄乱约束——你可以设置子视图的位置 appropra
如果您将视图添加viewB
到视图viewA
:
a) 定位viewB
,使其底部边缘对应于viewA
:
viewB.frame.origin.y = viewA.bounds.size.height - viewB.bounds.size.height;
b)你没有说哪个角落,但这只是做数学的问题。例如,viewA 的坐标系中的右上角viewA
是 at {viewA.bounds.size.x, 0}
。如果要放在viewB
那里,请将其原点设置为:
{viewA.bounds.size.x-viewB.bounds.size.x, 0}
如果要添加边距,可以将其添加到计算中:
int margin = 10;
{viewA.bounds.size.x-viewB.bounds.size.x-margin, margin}
d) 使用 NSLayoutConstraint 以编程方式访问自动布局系统的约束。有一种很好的视觉格式语言,因此对于您的问题 (a),您可以将约束设置为viewA
:
V:|-[viewB]-0-|
V
表示您在垂直方向上工作,'表示父视图(即)|
的边缘(顶部和底部,多亏了) ,意味着其父视图与底部之间的距离应为 0。V
viewA
0
viewB
您可以在 iOS6 中设置约束,但如果您想在较旧的操作系统上工作,您需要手动定位它们。数学。