作者:W蓝尾蝶SUH_435 | 来源:互联网 | 2023-10-10 10:32
在现实编程中,我们经常碰到各种的UI问题,今天我带大家一起学习,如何操作UIView的各种方法,好了直接上代码。1.addSubView-(void)viewDidLoad{[su
在现实编程中,我们经常碰到各种的UI问题,今天我带大家一起学习,如何操作UIView的各种方法,好了直接上代码。
1.addSubView
- (void)viewDidLoad {
[super viewDidLoad];
// 1.addSubView UIView*testView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; testView.backgroundColor = [UIColor redColor]; [self.view addSubview:testView];/*详解** addSubview:
添加一个子视图到接收者并让它在最上面显示出来。
- (void)addSubview:(UIView *)view 讨论 这方法同样设置了接收者为下一个视图响应对象。接收者保留视图。
如果你使用 removeFromSuperview方法用来把视图移除他的显示列表,那么视图将会被释放。
如果你想 要在视图移除显示列表後保留并使用这个视图(如果,举个例子,你想要交换一些视图的位 置。),
你不许保留那个视图在他调用removeFromSuperview前。
*/
}
2.bringSubviewToFront
//2.bringSubviewToFront
UIView *bringView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
bringView .backgroundColor = [UIColor grayColor];
[self.view addSubview:bringView];
[self.view bringSubviewToFront:testView]; /**详解 bringSubviewToFront
把指定的子视图移动到顶层
- (void)bringSubviewToFront:(UIView *)view 参数 view 需要移到顶 层的视图 */
3.convertPoint:fromView:
//3.convertPoint:fromView:
CGPoint viewPoint = [self.view convertPoint:testView.frame.origin fromView:testView]; /**详解
把一个点从一个坐标系转换到接收者的坐标系 - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view 参数 point 一个视图中坐标系上的点 view 一个视图包含了点和他自 身坐标系。如果是图是nil,那么这个方法将尝试转换基于窗口的坐标系。否则视图和那个接收 者必须属于同一个UIWindow对象。 返回值 一个转换到接收者坐标系的点
*/
4.convertPoint:toView:
//4.convertPoint:toView: CGPoint viewPoint2 = [self.view convertPoint:testView.frame.origin toView:bringView];
/**详解 转换一个点从接收者坐标系到给定的视图坐标系 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view 参数 point 一个在调用者坐标系中的点 view 一个包含了需要被转换的点 的视图。如果视图是nil,那么这个方法将会转换成基于窗口的坐标。否则视图和接收者都要属 于同一个UIWindow对象。 返回值 基于视图的坐标系转换过的点
*/
5.convertRect:fromView:
//5.convertRect:fromView: CGRect rc = [self.view convertRect:cell.btn.frame fromView:cell]; /**详解
转换一个矩形从其他视图坐标系到接收者坐标系。 - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view 参数 rect 一个在视图坐标系中的矩形 view 一个视图内部有矩形在他 的坐标系中。如果视图是nil,那么这个方法将会基于窗口来转换。否则视图和接收者必须都属 于同一个UIWindow对象 返回值 The converted rectangle 转换过的矩形
*/
6.converRect:toView:
//6.convertRect:toView:
CGRect rc = [cell convertRect:cell.btn.frame toView:self.view];
/**详解
转换接收者坐标系中的矩形到其他视图 - (CGRect)convertRect:(CGRect)rect toView:(UIView *)view 参数 rect 一个在接收者坐标系中的矩形 view 要转换过去的目标视图对象。如果这个是 视图是nil,这个方法将会基于窗口坐标系来转换。否者视图和接收者必须属于同一个 UIwindow对象 返回值 一个转换过的矩形
*/
7.didAddSubview:
-(void)didAddSubview:(UIView *)subview
{ /**详解
告诉视图当子视图已经添加 - (void)didAddSubview:(UIView *)subview 参数 subview 被添加做 子视图的视图对象 讨论 被子类重写用来执行额外的命令当子视图添加到接收者。这个方法被
addSubview调用
*/
NSLog(@"didAddSubview");
}
didMoveToSuperview
-(void)didMoveToSuperview
{
/*详解
didMoveToSuperview
通知接收者父视图已经改变(nil是允许的) - (void)didMoveToSuperview 讨论 默认不做任何 事情;子类可以重写这方法来作为特定的实现
*/ NSLog(@"didMoveToSuperview");
}
9. didMoveToWindow
-(void)didMoveToWindow
{
/*详解
didMoveToWindow
通知接收者它一斤给添加到窗口中 - (void)didMoveToWindow 讨论 默认实现不做任何事情; 子类可以重写这个方法来做特殊的实现 窗口的属性有可能是nil当这个方法调用的时候,这表明 接收者并不属于当然任何一个窗口。这个只发生在接收者从它的父视图上移除或者接收者添加 到父视图中而不是添加到window中。重写这个方法可以用来选择忽略一些他们不关心的对象
*/
NSLog(@"didMoveToWindow");
}
10. drawRect
- (void)drawRect:(CGRect)rect {
/*详解
在接收者视图中绘制矩形 - (void)drawRect:(CGRect)rect 参数 rect 一个定义的需要绘制的矩形 讨论 子类重写这个方法如果他们确实要绘制他们自定义的视图。如果子类是其他视图的容器那 么它不需要重写这个方法。默认的实现不做任何事情。如果你自定义的视图是一个UIView子 类,你不需要去调用它的父类实现。注意如果它的父类实现绘制并且不透明属性为YES那么每 一个子类都需要填充矩形。 当这个方法被调用,接收者可以假定他的帧在坐标上已经转换,边 界矩形已经应用;所有他要做的就是绘制自定义的方法。使用UIGraphicsGetCurrentContext 方法去获取当前图形内容用来绘制,坐标原点在左上角。不要保留图片内容当他可以被 drawRect:这个方法调用。
*/ }
11.exchangeSubviewAtIndex:withSubviewAtIndex:
// 11.exchangeSubviewAtIndex
/**详解
exchangeSubviewAtIndex:withSubviewAtIndex:
交换接收者的子视图和给定的索引视图 - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2 参数 index1 一个需要取代索引2的子视图 index2 一个 需要取代索引1的子视图
*/
12.hitTest:withEvent:
返回接收者视图层次中最远的派生(包括它本身)的特定的点。 - (UIView )hitTest: (CGPoint)point withEvent:(UIEvent )event 参数 point 接收者坐标系中的点 event 触发这个方法 的事件或者是如果这个方法被预调用就返回nil 返回值 一个视图对象最远的派生点。如果这个 点位于接收者之外就返回nil 讨论 这个方法贯穿视图的层次发送pointInside:withEvent: 消息到 每一个子视图用来决定那个子视图需要接收触摸事件。如果pointInside:withEvent: 返回YES, 那么视图的层次全部贯穿;否则视图层次的分支是被否定的。你不太需要调用这个方法,但是 你需要重写它用来隐藏子视图的触摸事件。 如果视图是隐藏的,禁止用户交互的或者透明值小 于01那么这个方法不可用
13.insertSubview:belowSubview:
// /*
插入视图到显示链的底层 - (void)insertSubview:(UIView )view belowSubview:(UIView )siblingSubview 参数 view 一个需要插入到其他视图底部的视图。它将从它的父视图移除如果 它不与相邻视图的相邻 siblingSubview 一个相邻视图将会在插入的视图之上
insertSubview:aboveSubview: 在视图层次顶层插入一个视图 - (void)insertSubview:(UIView )view aboveSubview:(UIView )siblingSubview 参数 view 一个插入被用来放在顶层的视图。它 将会从父视图中移除如果它不是相邻视图 siblingSubview 一个相邻视图用来放在插入视图的後 面
insertSubview:atIndex: 插入视图到指定的索引 - (void)insertSubview:(UIView *)view atIndex: (NSInteger)index 参数 view 插入的视图,这个值不能是nil index 子视图索引从0开始并且不能 大于子视图的数量
*/ [self.view insertSubview:testView belowSubview:bringView];
[self.view insertSubview:bringView aboveSubview:testView];
[self.view insertSubview:testView atIndex:0];
// 14.isDescendantOfView:
BOOL isSub = [self.view isDescendantOfView:testView]; // 14.isDescendantOfView:
/* 返回一个布尔值指出接收者是否是给定视图的子视图或者指向那个视图 - (BOOL)isDescendantOfView:(UIView *)view 参数 view 一个视图用来测试子视图在视图层次中 的关系 返回值 如果接收者是视图的子视图就返回YES,或者视图就是接收者;否则就是NO
*/
15.layoutIfNeeded
// 15.layoutIfNeeded /* 排列子视图如果需要的话 - (void)layoutIfNeeded 讨论 使用这个方法来关注子视图的排列在绘 制前*/ [self.view layoutIfNeeded];
16.layoutSubViews
-(void)layoutSubviews
{
/* layoutSubviews
排列子视图 - (void)layoutSubviews 讨论 当layoutIfNeeded被调用是子类用来重写这个方法来 排列子视图。默认实现这个方法不做任何事情。*/
NSLog(@"layoutSubviews");
}
17.pointInside:withEvent:
pointInside:withEvent:
返回一个布尔值指出接收者是否包含特定的点 - (BOOL)pointInside:(CGPoint)point withEvent: (UIEvent *)event 参数 point 一个在接收者坐标系内的点 event 这个方法的目标事件或者如果这 个方法被预调用返回nil 返回值 如果点在接收者边界内返回YES,否则返回NO
removeFromSuperview
removeFromSuperview
把接收者从它的父视图或者窗口移除,并在响应链中移除。 – (void)removeFromSuperview 讨 论 接收者同时释放;如果你计划重用它,要确定在发送消息前保持它并在添加到其他UIView 对象作为子视图後移除。 不要在显示的时候调用
sendSubviewToBack
//sendSubviewToBack:
/ 移动指定的子视图到它相邻视图的後面 – (void)sendSubviewToBack:(UIView )view 参数 view 一个子视图用来移动到它後面去*/
setNeedsDisplay
// setNeedsDisplay
/* 控制接收者的边界矩形被标记为需要显示 -(void)setNeedsDisplay 讨论 默认情况下,视图几何 图形的改变自动重绘而不需要调用drawRect:方法。因此,你需要去请求视图重绘当视图的数 据或者状态改变的时候。从这个意义上来说,向视图发送setNeedsDisplay消息。任何UIView 对象标记为需要显示後将会在应用程序循环中自动重新绘制。
*/ [self.view setNeedsDisplay];
setNeedsDisplayInRect
//setNeedsDisplayInRect:
/* 标记接收者中的特定的矩形区域为需要显示,或者添加接收者现有的其他无效区域 - (void)setNeedsDisplayInRect:(CGRect)invalidRect 参数 invalidRect 标记接收者的矩形区域为 无效的;他需要在接收者坐标系中定义。 讨论 默认情况下,视图几何图形的改变自动重绘而 不需要调用drawRect:方法。因此,你需要去请求视图重绘当视图的数据或者状态改变的时 候。使用这个方法或者用setNeedsDisplay方法来标记视图需要显示的地方。*/ [self.view setNeedsDisplayInRect:CGRectMake(10, 10, 10, 10)];
setNeedsLayout
// setNeedsLayout
/*设置当子视图显示的时候需要重新排列 - (void)setNeedsLayout 讨论 如果你调用这个方法在下 一个显示方法之间,那么layoutIfNeeded排列子视图;否则将不会做任何事情*/ [self.view setNeedsLayout];
sizeThatFits
//sizeThatFits:
/*计算并返回一个最好的适应接收者子视图的大小 - (CGSize)sizeThatFits:(CGSize)size 参数 size 接收者首选的尺寸 返回值 一个新的大小用来适应接收者子视图 讨论 默认的实现返回大小 参数 子类重写这个方法用来返回特定视图的大小。举个粒子,UISwitch返回一个修正过的大 小,UIImageView返回图片的大小 这个方法并没有改变接收者的大小*/
CGSize size = [self.view sizeThatFits:CGSizeMake(100, 100)];
sizeToFit
//sizeToFit
/* 调整大小并移动接收者视图大小所以他包含了他的子视图 - (void)sizeToFit 讨论 这个方法使用 sizeThatFits: 方法来决定大小。子类需要重写sizeThatFits:用来计算正确的尺寸大小。默认的 实现不做任何事情。*/
[self.view sizeToFit];