iOS UIView非常用方法及属性详解

本文详细介绍了iOS中视图的布局原理,包括视图的大小、位置属性如frame、bounds和center,以及如何通过autoresizingMask自动调整视图大小。此外,还探讨了视图的层级关系、坐标转换方法、动画效果实现方式以及触摸事件处理。

在调用视图的 Quartz  调用都可以正确地在视图中描画。

 
视图对象通过 bounds 、和 center  属 性声明来跟踪自己的大小和位置。frame 属性包含一个矩形,即边框矩形,用于指定视图相对于其父视图坐标系统的位置和大小。bounds 属性也包含一个矩形,即边界矩形,负责定义视图相对于本地坐标系统的位置和大小。虽然边界矩形的原点通常被设置为(0, 0),但这并不是必须的。center 属性包含边框矩形的中心点。
 
当您在代码中通过 initWithFrame :方法创建一个视图对象时,其frame 属性就会被设置。该方法同时也将bounds 矩形的原点初始化为(0.0, 0.0),大小则和视图的边框相同。然后center 属性会被设置为边框的中心点。
 
缺省情况下,视图的边框并不会被父视图的边框裁剪。如果您希望让一个视图裁剪
其子视图,需要将其 clipsToBounds  属性设置为YES。
 
举例来说, UIView  类中包含一个 transform  属性声明,您可以通过它来对整个视图实行各种类型的平移、比例缩放、和变焦缩放效果。缺省情况下,这个属性的值是一个恒等变换,不会改变视图的外观。在加入变换之前,首先要得到该属性中存储的 CGAffineTransform  结构,用相应的Core Graphics 函数实行变换,然后再将修改后的变换结构重新赋值给视图的transform 属性。
 
视图的 contentMode  属性决定了边界变化和缩放操作作用到视图上产生的效果。
缺省情况下,这个属性的值被设置为 UIViewContentModeScaleToFill ,意味着视图内容总是被缩放,以适应新的边框尺寸。
 
不同的 UIViewContentMode  常量(比如 UIViewContentModeTop  和
UIViewContentModeBottomRight )可以使当前的内容在视图的不同角落或沿着视图的不同边界显示,还有一种模式可以将内容显示在视图的中心。
 
当您希望在应用程序中实现尺寸可调整的控件时,请务必考虑使用 UIViewContentModeRedraw  模式
 
如果视图的 autoresizesSubviews  属性声明被设置为YES,则其子视图会根据
autoresizingMask  属性的值自动进行尺寸调整。否则,应用程序就必须通过重载 layoutSubviews  方法来提供自己的实现。
 
如果要使一个视图和其父视图左下角的相对位置保持不变, 可以加入 UIViewAutoresizingFlexibleTopMargin  常量,并将结果赋值给 autoresizingMask  属性。当同一个轴向有多个部分被设置为可变时,尺寸调整的裕量会被平均分配到各个部分上。
 
UIViewAutoresizingNone  这个常量如果被设置,视图将不进行自动尺寸调整。
UIViewAutoresizingFlexibleWidth
这个常量如果被设置,视图的宽度将和父视图的宽度一起成比
例变化。否则,视图的宽度将保持不变。
UIViewAutoresizingFlexibleRightMargin
这个常量如果被设置,视图的右边界将随着父视图宽度的变化
而按比例进行调整。否则,视图和其父视图的右边界的相对位
置将保持不变。
UIViewAutoresizingFlexibleTopMargin
这个常量如果被设置,视图的上边界将随着父视图高度的变化
而按比例进行调整。否则,视图和其父视图的上边界的相对位
置将保持不变。
 
 

 
如果您通过 Interface Builder  配置视图,则可以用Size 查看器的 Autosizing  控 制来设置每个视图的自动尺寸调整行为。上图中的灵活宽度及高度常量和Interface Builder 中位于同样位置的弹簧具有同样的行为,但是空白常量的行为则是正好相反。换句话说,如果要将灵活右空白的自动尺寸调整行为应用到Interface Builder 的某个视图,必须使相应方向空间的 Autosizing  控制为空,而不是放置一个支柱。
 
如果视图的 autoresizesSubviews  属性被设置为 UIViewAutoresizingNone ,则该子视图的尺寸将不会被调整,因而其直接子视图的尺寸也不会被调整。
 
视图层次中的父-子关系可以帮助我们定义应用程序中负责处理触摸事件的对象链
 
创建一个新的视图对象时,需要为其分配内存,并向该对象发送一个 UIView  类的实例作为其它视图的容器,则可以使用下面的代码:
CGRect  viewRect = CGRectMake(0, 0, 100, 100);
UIView* myView = [[UIView alloc]  initWithFrame :viewRect];
 
在iPhone 程序中,有两个地方最常用于创建视图和子视图, 它们是应用程序委托对象的 loadView  方法。
 
调用父视图的 insertSubview :...方法可以在父视图的子视图列表中间插入视图。
调用父视图的 sendSubviewToBack : 、或
removeFromSuperview  方法可以将子视图从父视图中移除。
 
创建一个带有视图的窗口
- (void) UIScreen  mainScreen]  bounds]];
window. backgroundColor  = [UIColor whiteColor];
// Create a simple red square
CGRect redFrame = CGRectMake(10, 10, 100, 100);
UIView *redView = [[UIView alloc] initWithFrame:redFrame];
redView.backgroundColor = [UIColor redColor];
// Create a simple blue square
CGRect blueFrame = CGRectMake(10, 150, 100, 100);
UIView *blueView = [[UIView alloc] initWithFrame:blueFrame];
blueView.backgroundColor = [UIColor blueColor];
// Add the square views to the window
[window addSubview:redView];
[window addSubview:blueView];
// Once added to the window, release the views to avoid the
// extra retain count on each of them.
[redView release];
[blueView release];
// Show the window.
[window makeKeyAndVisible];
}
 
当您为某个视图添加子视图时,UIKit 会向相应的父子视图发送几个消息,通知它们当前发生的状态变化。您可以在自己的定制视图中对诸如 willMoveToWindow : 、 didAddSubview : 、 didMoveToSuperview  、和 didMoveToWindow 这样的方法进行重载,以便在事件发生的前后进行必要的处理,并根据发生的变化更新视图的状态信息。
 
在视图层次建立之后,您可以通过视图的 superview  属性来取得其父视图,或者通过 isDescendantOfView :方法来判定一个视图是否在其父视图的视图层中。一个视图层次的根视图没有父视图,因此其superview 属性被设置为nil。对于当前被显示在屏幕上的视图,窗口对象通常是整个视图层次的根视图。 
 
UIView 类定义了下面这些方法,用于在不同的视图本地坐标系统之间进行坐标转换:
convertPoint:fromView:
convertRect:fromView:
convertPoint:toView:
convertRect:toView:
UIWindow 的版本则使用窗口坐标系统。
convertPoint:fromWindow:
convertRect:fromWindow:
convertPoint:toWindow:
convertRect:toWindow:
 
UIView 类中包含一个 tag  属性。借助这个属性,您可以通过一个整数值来标识一个视图对象。您可以通过这个属性来唯一标识视图层次中的视图,以及在运行时进行视图的检索(基于 tag 标识的检索比您自行遍历视图层次要快)。tag 属性的缺省值为0。您可以通过UIView 的 viewWithTag :方法来检索标识过的视图
 
动画块从调用UIView 的 commitAnimations 类 方法作为结束。在这两个调用之间,您可以配置动画的参数和改变希望实行动画的属性值。一旦调用commitAnimations 方法,UIKit 就会开始执行动画,即把给定属性从当前值到新值的变化过程用动画表现出来。动画块可以被嵌套,但是在最外层的动画块提交之前,被嵌套的动画不会被执行。
 
frame 视图的边框矩形,位于父视图的坐标系中。
bounds 视图的边界矩形,位于视图的坐标系中。
center 边框的中心,位于父视图的坐标系中。
transform 视图上的转换矩阵,相对于视图边界的中心。
alpha 视图的alpha 值,用于确定视图的透明度。
 
setAnimationDelay :方法来设置实际发生动画和commitAnimations 方法返回的时间点之间的间隔。
setAnimationCurve :方法来设置动画过程的相对速度,比如动画可能在启示阶段逐渐加速,而在结束阶段逐渐减速,或者整个过程都保持相同的速度。
setAnimationRepeatAutoreverses :方法来指定动画在到达目标值时是否自动反向播放。您可以结合使用这个方法和 setAnimationRepeatCount :方法,使各个属性在初始值和目标值之间平滑切换一段时间。
 
您可以通过UIView 的
setAnimationWillStartSelector : 和
setAnimationDidStopSelector :方法来指定接收消息的选择器方法。消息处理方法的形式如下:
- (void)animationWillStart:(NSString *)animationID context:(void *)context;
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void
*)context;
上面两个方法的animationID 和context 参数和动画块开始时传 animationID  - 应用程序提供的字符串,用于标识一个动画块中的动画。
context  - 也是应用程序提供的对象,用于向委托对象传递额外的信息。
setAnimationDidStopSelector :选择器方法还有一个参数—即一个布尔值。如果动画顺利完成,没有被其它动画取消或停止,则该值为YES。
 
  任何时候,当视图的布局发生改变时,UIKit 会激活每个视图的自动尺寸调整行为,然后调用各自的 layoutSubviews  方法,使您有机会进一步调整子视图的几何尺寸。
您的应用程序调用视图的 setNeedsLayout  或 layoutIfNeeded  方法来强制进行布局。
您的应用程序调用视图背后的层对象的 setNeedsLayout  方法来强制进行布局。
 
您也可以用 layoutSubviews  方法来调整作为子层链接到视图层的定制 CALayer  对
有些时候,应用程序数据模型的变化会影响到相应的用户界面。为了反映这些变化,您可以将相应的视图标识为需要刷新(通过调用 setNeedsDisplay  或 setNeedsDisplayInRect :方法)
 
您可以通过改变视图的 hidden  属性声明来隐藏或显示视图
 
初始化一个视图的子类
- (id) initWithFrame :(CGRect)aRect {
self = [super initWithFrame:aRect];
if (self) {
// setup the initial properties of
the view
...
}
return self;
}
 
在iPhone OS 中,装载nib 的代
码并不通过 initWithCoder :方法来进行。
 
CGContextRef  context =  UIGraphicsGetCurrentContext ();
CGRect myFrame = self.bounds;
CGContextSetLineWidth (context, 10);
[[UIColor redColor] set];
UIRectFrame (myFrame); // 捣鼓来捣鼓去,搞得复杂!!!
}
 
处理触摸事件的视图通常需要实现下面的所有方法
touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:
激活多点触摸事件: multipleTouchEnabled  属性声明设置为YES。
您可以通过改变视图的 userInteractionEnabled  属性值来控制视图是否可以对事件进行处理。
还可以使用UIApplication 对象的 beginIgnoringInteractionEvents  和
endIgnoringInteractionEvents  方法
 
UIKit 会通过UIView 的 pointInside:withEvent :方法
来确定触摸事件是否发生在指定的视图上。

转载于:https://www.cnblogs.com/Free-Thinker/p/4946703.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值