
addSubview:
- (void)addSubview:(UIView )view
讨论
这方法同样设置了接收者为下一个视图响应对象。接收者保留视图。如果你使用removeFromSuperview方法用来把视图移除他的显示列表,那么视图将会被释放。如果你想要在视图移除显示列表後保留并使用这个视图(如果,举个例子,你想要交换一些视图的位置。),你不许保留那个视图在他调用removeFromSuperview前。
bringSubviewToFront:
把指定的子视图移动到顶层
- (void)bringSubviewToFront:(UIView )view
参数
view
需要移到顶层的视图
convertPoint:fromView:
把一个点从一个坐标系转换到接收者的坐标系
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView)view
参数
point
一个视图中坐标系上的点
view
一个视图包含了点和他自身坐标系。如果是图是nil,那么这个方法将尝试转换基于窗口的坐标系。否则视图和那个接收者必须属于同一个UIWindow对象。
返回值
一个转换到接收者坐标系的点
//这里的convert语句,如果是toView,前面调用的时候都是之前point或者rect的父视图,后面toView中应该用将转换到的目标视图,如此得到在目标视图中的point或者frame
//如果是fromView的话,刚好相反,前面是目标视图调用,fromView是原point或者rect的父视图,同样返回在目标视图中的point或者frame
convertPoint:toView:
转换一个点从接收者坐标系到给定的视图坐标系
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView )view
参数
point
一个在调用者坐标系中的点
view
一个包含了需要被转换的点的视图。如果视图是nil,那么这个方法将会转换成基于窗口的坐标。否则视图和接收者都要属于同一个UIWindow对象。
返回值
基于视图的坐标系转换过的点
convertRect:fromView:
转换一个矩形从其他视图坐标系到接收者坐标系。
- (CGRect)convertRect:(CGRect)rect fromView:(UIView )view
参数
rect
一个在视图坐标系中的矩形
view
一个视图内部有矩形在他的坐标系中。如果视图是nil,那么这个方法将会基于窗口来转换。否则视图和接收者必须都属于同一个UIWindow对象
返回值
The converted rectangle
转换过的矩形
convertRect:toView:
转换接收者坐标系中的矩形到其他视图
- (CGRect)convertRect:(CGRect)rect toView:(UIView )view
参数
rect
一个在接收者坐标系中的矩形
view
要转换过去的目标视图对象。如果这个是视图是nil,这个方法将会基于窗口坐标系来转换。否者视图和接收者必须属于同一个UIwindow对象
返回值
一个转换过的矩形
didAddSubview:
告诉视图当子视图已经添加
- (void)didAddSubview:(UIView )subview
参数
subview
被添加做子视图的视图对象
讨论
被子类重写用来执行额外的命令当子视图添加到接收者。这个方法被addSubview调用
/didMoveToWindow与didMoveToSuperview的区别
功能上两者都是加载视图,同时使用两者时候调用顺序:
第一步:调用didMoveToWindow
第二步:调用didMoveToSuperview
第三步:再次调用didMoveToWindow
可以不实现didMoveToSuperview,在使用UIPickerView的时候初次加载默认选项可以使用didMoveToSuperview
这两个方法的调用在每次加载的时候都调用,譬如在UIScrollView中放置其个view,每次view出现的时候调用一次didMoveToWindow和didMoveToSuperview,消失的时候调用一次didMoveToWindow;再次出现的时候再次进行这样的 *** 作。
/
didMoveToSuperview
通知接收者父视图已经改变(nil是允许的)
- (void)didMoveToSuperview
讨论
默认不做任何事情;子类可以重写这方法来作为特定的实现
didMoveToWindow
通知接收者它一斤给添加到窗口中
- (void)didMoveToWindow
讨论
默认实现不做任何事情;子类可以重写这个方法来做特殊的实现
窗口的属性有可能是nil当这个方法调用的时候,这表明接收者并不属于当然任何一个窗口。这个只发生在接收者从它的父视图上移除或者接收者添加到父视图中而不是添加到window中。重写这个方法可以用来选择忽略一些他们不关心的对象
drawRect:
在接收者视图中绘制矩形
- (void)drawRect:(CGRect)rect
参数
rect
一个定义的需要绘制的矩形
讨论
子类重写这个方法如果他们确实要绘制他们自定义的视图。如果子类是其他视图的容器那么它不需要重写这个方法。默认的实现不做任何事情。如果你自定义的视图是一个UIView子类,你不需要去调用它的父类实现。注意如果它的父类实现绘制并且不透明属性为YES那么每一个子类都需要填充矩形。
当这个方 法被调用,接收者可以假定他的帧在坐标上已经转换,边界矩形已经应用;所有他要做的就是绘制自定义的方法。使用UIGraphicsGetCurrentContext方法去获取当前图形内容用来绘制,坐标原点在左上角。不要保留内容当他可以被drawRect:这个方法调用。
exchangeSubviewAtIndex:withSubviewAtIndex:
交换接收者的子视图和给定的索引视图
- (void)exchangeSubviewAtIndex:(NSInteger)index1withSubviewAtIndex:(NSInteger)index2
参数
index1
一个需要取代索引2的子视图
index2
一个需要取代索引1的子视图
hitTest:withEvent:
返回接收者视图层次中最远的派生(包括它本身)的特定的点。
- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event
参数
point
接收者坐标系中的点
event
触发这个方法的事件或者是如果这个方法被预调用就返回nil
返回值
一个视图对象最远的派生点。如果这个点位于接收者之外就返回nil
讨论
这 个方法贯穿视图的层次发送pointInside:withEvent:消息到每一个子视图用来决定那个子视图需要接收触摸事件。如果pointInside:withEvent:返回YES,那么视图的层次全部贯穿;否则视图层次的分支是被否定的。你不太需要调用这个方法,但是你需要重写它用来隐藏子视图的触摸事件。
如果视图是隐藏的,禁止用户交互的或者透明值小于01那么这个方法不可用
initWithFrame:
初始化并返回一个新的拥有特定帧矩形的视图对象
- (id)initWithFrame:(CGRect)aRect
参数
aRect
一个帧矩形用来创建视图对象。原始的帧在它的父视图的坐标系中。设置这个属性用来改变中心和边界属性。
返回值
一个初始化的视图对象,如果没有被创建那就返回nil
讨论
一个新的视图对象必须添加到视图链中才能使用。这个方法为UIView类指出初始化对象。
insertSubview:aboveSubview:
在视图层次顶层插入一个视图
- (void)insertSubview:(UIView )view aboveSubview:(UIView)siblingSubview
参数
view
一个插入被用来放在顶层的视图。它将会从父视图中移除如果它不是相邻视图
siblingSubview
一个相邻视图用来放在插入视图的後面
insertSubview:atIndex:
插入视图到指定的索引
- (void)insertSubview:(UIView )view atIndex:(NSInteger)index
参数
view
插入的视图,这个值不能是nil
index
子视图索引从0开始并且不能大于子视图的数量
insertSubview:belowSubview:
插入视图到显示链的底层
- (void)insertSubview:(UIView )view belowSubview:(UIView)siblingSubview
参数
view
一个需要插入到其他视图底部的视图。它将从它的父视图移除如果它不与相邻视图的相邻
siblingSubview
一个相邻视图将会在插入的视图之上
isDescendantOfView:
返回一个布尔值指出接收者是否是给定视图的子视图或者指向那个视图
- (BOOL)isDescendantOfView:(UIView )view
参数
view
一个视图用来测试子视图在视图层次中的关系
返回值
如果接收者是视图的子视图就返回YES,或者视图就是接收者;否则就是NO
layoutIfNeeded
排列子视图如果需要的话
- (void)layoutIfNeeded
讨论
使用这个方法来关注子视图的排列在绘制前
layoutSubviews
排列子视图
- (void)layoutSubviews
讨论
当layoutIfNeeded被调用是子类用来重写这个方法来排列子视图。默认实现这个方法不做任何事情。
pointInside:withEvent:
返回一个布尔值指出接收者是否包含特定的点
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent )event
参数
point
一个在接收者坐标系内的点
event
这个方法的目标事件或者如果这个方法被预调用返回nil
返回值
如果点在接收者边界内返回YES,否则返回NO
removeFromSuperview
把接收者从它的父视图或者窗口移除,并在响应链中移除。
- (void)removeFromSuperview
讨论
接收者同时释放;如果你计划重用它,要确定在发送消息前保持它并在添加到其他UIView对象作为子视图後移除。不要在显示的时候调用
sendSubviewToBack:
移动指定的子视图到它相邻视图的後面
- (void)sendSubviewToBack:(UIView )view
参数
view
一个子视图用来移动到它後面去
setNeedsDisplay
控制接收者的边界矩形被标记为需要显示
-(void)setNeedsDisplay
讨论
默认情况下,视图几何图形的改变自动重绘而不需要调用drawRect:方法。因此,你需要去请求视图重绘当视图的数据或者状态改变的时候。从这个意义上来说,向视图发送setNeedsDisplay消息。任何UIView对象标记为需要显示後将会在应用程序循环中自动重新绘制。
setNeedsDisplayInRect:
标记接收者中的特定的矩形区域为需要显示,或者添加接收者现有的其他无效区域
- (void)setNeedsDisplayInRect:(CGRect)invalidRect
参数
invalidRect
标记接收者的矩形区域为无效的;他需要在接收者坐标系中定义。
讨论
默认情况下,视图几何图形的改变自动重绘而不需要调用drawRect:方法。因此,你需要去请求视图重绘当视图的数据或者状态改变的时候。使用这个方法或者用setNeedsDisplay方法来标记视图需要显示的地方。
setNeedsLayout
设置当子视图显示的时候需要重新排列
- (void)setNeedsLayout
讨论
如果你调用这个方法在下一个显示方法之间,那么layoutIfNeeded排列子视图;否则将不会做任何事情
sizeThatFits:
计算并返回一个最好的适应接收者子视图的大小
- (CGSize)sizeThatFits:(CGSize)size
参数
size
接收者首选的尺寸
返回值
一个新的大小用来适应接收者子视图
讨论
默认的实现返回大小参数子类重写这个方法用来返回特定视图的大小。举个粒子,UISwitch返回一个修正过的大小,UIImageView返回的大小这个方法并没有改变接收者的大小
sizeToFit
调整大小并移动接收者视图大小所以他包含了他的子视图
- (void)sizeToFit
讨论
这个方法使用sizeThatFits:方法来决定大小。子类需要重写sizeThatFits:用来计算正确的尺寸大小。默认的实现不做任何事情。
viewWithTag:
返回视图的特定的标签
- (UIView )viewWithTag:(NSInteger)tag
参数
tag
一个用来在视图中搜索的标签
返回值
视图在接收者层次中符合的标签,接收者也包含在搜索中。
willMoveToSuperview:
通知接收者他的父视图将会改变到特定的父视图(也有可能是nil)
- (void)willMoveToSuperview:(UIView )newSuperview
参数
newSuperview
新的视图对象将会是接收者新的父视图
讨论
子类可以重写这个方法来做一些特定的行为
willMoveToWindow:
通知接收者它已经被添加到特定的窗口对戏那个的视图层次中(也有可能是nil)
- (void)willMoveToWindow:(UIWindow )newWindow
参数
newWindow
一个窗口对象将会成为接收者新的视图层次的根视图
讨论
子类可以重写这个方法来提供一些特定的必要实现
willRemoveSubview:
由子类重写用来在子视图从接收者视图中移除前执行一些特定的方法。
- (void)willRemoveSubview:(UIView )subview
参数
subview
子视图将会被移除
讨论
这个方法被调用当子视图接收到removeFromSuperview消息或者子视图从接收者视图层次中移除因为它要被添加到其他视图了
下边有整体效果,希望能帮助到你!
定义一个视图
@property (weak, nonatomic) IBOutlet UIImageView imageView;
一、旋转三种方式:
第一种:根据CGPathAddArc 绘画旋转路线:
/
1、<#CGMutablePathRef _Nullable path#> 路线
2、确定圆心<#CGFloat x#> <#CGFloat y#>
3、半径<#CGFloat radius#>
4、起点 <#CGFloat startAngle#> 结束 <#CGFloat endAngle#>
/
CGPathAddArc(path, NULL, selfviewcenterx, selfviewcentery, 01, 0, M_PI 2, 1);
CAKeyframeAnimation frameAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
frameAnimationpath= path;
CGPathRelease(path);
frameAnimationdelegate=self;
frameAnimationduration=10;// 持续时间
frameAnimationrepeatCount = -1;// 重复次数 如果为0表示不执行,-1表示不限制次数,默认为0
frameAnimationautoreverses=NO;
frameAnimationrotationMode = kCAAnimationRotateAuto;// 样式
frameAnimationfillMode = kCAFillModeForwards;
[selfimageViewlayeraddAnimation:frameAnimationforKey:nil];
第二种:
[UIView animateWithDuration:200f animations:^{
if (selfimageView) {
selfimageViewtransform = CGAffineTransformMakeRotation(M_PI5);
}
}];
第三种:
CABasicAnimation animation = [CABasicAnimation animationWithKeyPath:@"transformrotationz"];
//默认是顺时针效果,若将fromValue和toValue的值互换,则为逆时针效果
animationfromValue = [NSNumber numberWithFloat:0f];
animationtoValue = [NSNumber numberWithFloat: M_PI 2];
animationduration=30;
animationautoreverses=NO;
animationfillMode = kCAFillModeForwards;
animationrepeatCount = MAXFLOAT; //如果这里想设置成一直自旋转,可以设置为MAXFLOAT,否则设置具体的数值则代表执行多少次
[selfimageViewlayer addAnimation:animation forKey:nil];
持续旋转:
@property(nonatomic,assign) double angle;
CGAffineTransform endAngle = CGAffineTransformMakeRotation(selfangle (M_PI / 1800f));
[UIView animateWithDuration:001 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
selfimageViewtransform= endAngle;
}completion:^(BOOLfinished) {
selfangle+=10;
[self startAnimation2];// 上边任意一种方法回调
}];
// 当视图停止转动时调用此方法重新转动
-(void)endAnimation {
selfangle+=4;
[self startAnimation2];
}
二、水波纹动画
属性定义:几个波纹定义几个X 宽度可以用一个 也可以分开定义
@property (weak, nonatomic) IBOutlet UIView backView;
@property(nonatomic,strong) CAShapeLayer waterLayer1;
@property(nonatomic,strong) CAShapeLayer waterLayer2;
@property(nonatomic,assign) CGFloat x;
@property(nonatomic,assign) CGFloat y;
@property(nonatomic,assign) CGFloat waveHeight;
@property(nonatomic,assign) CGFloat waveWidth;
@property(nonatomic,assign) int speedWave;
@property(nonatomic,assign) CGFloat waveAmplitude;
@property(nonatomic,assign) int speed;
@property(nonatomic,assign) CGFloat speed_H;
@property(nonatomic,assign) CGFloat offsetXT;
-(instancetype)init {// 给个初始值,下边被除数不能为0
if (self == [super init]) {
selfspeedWave = 3;
selfwaveAmplitude = 3;
selfspeed=3;
selfwaveWidth = selfbackViewframesizewidth;
selfwaveHeight = selfbackViewframesizeheight;
selfspeed_H = selfbackViewframesizeheight-20;
}
return self;
}
-(void)waterAnimation {
// CGFloat y = _waveHeightsinf(25M_PIi/_waveWidth + 3_offsetM_PI/_waveWidth + M_PI/4) + _h;
selfwaterLayer1 = [CAShapeLayer layer];
selfwaterLayer1fillColor = [UIColor yellowColor]CGColor;
[selfbackViewlayer addSublayer:selfwaterLayer1];
selfwaterLayer2 = [CAShapeLayer layer];
selfwaterLayer2fillColor = [UIColor redColor]CGColor;
[selfbackViewlayer addSublayer: selfwaterLayer2];
//创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和selector 在屏幕刷新的时候调用
//CADispayLink相当于一个定时器 会一直绘制曲线波纹 看似在运动,其实是一直在绘画不同位置点的余弦函数曲线
CADisplayLink waveDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(getCurrentWave)];
[waveDisplayLinkaddToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
}
-(void)getCurrentWave {
// x位置
selfx+=selfspeed;
//声明第一条波曲线的路径
CGMutablePathRef path = CGPathCreateMutable();
//设置起始点
CGPathMoveToPoint(path,nil,0,selfwaveHeight);
CGFloaty =0f;
//第一个波纹的公式
for(floatx =0f; x <=selfwaveWidth; x++) {
y =selfwaveAmplitudesin((200/selfwaveWidth) (x M_PI/70) -selfxM_PI/170) +selfspeed_H1;
CGPathAddLineToPoint(path,nil, x, y);
x++;
}
//把绘图信息添加到路径里
CGPathAddLineToPoint(path, nil, selfwaveWidth, selfbackViewframesizeheight);
CGPathAddLineToPoint(path, nil, 0, selfbackViewframesizeheight);
//结束绘图信息
CGPathCloseSubpath(path);
selfwaterLayer1path= path;
//释放绘图路径
CGPathRelease(path);
[self X2];
}
/// 第二条水波
-(void)X2 {
selfoffsetXT += selfspeedWave;
CGMutablePathRef pathT = CGPathCreateMutable();
CGPathMoveToPoint(pathT,nil,0,selfwaveHeight+50);
CGFloatyT =0f;
for(floatx =0f; x <=selfwaveWidth; x++) {
yT =selfwaveAmplitude16sin((200/selfwaveWidth) (x M_PI/100) -selfoffsetXTM_PI/170) +selfwaveHeight;
CGPathAddLineToPoint(pathT,nil, x, yT-10);
}
CGPathAddLineToPoint(pathT, nil, selfwaveWidth, selfbackViewframesizeheight);
CGPathAddLineToPoint(pathT, nil, 0, selfbackViewframesizeheight);
CGPathCloseSubpath(pathT);
selfwaterLayer2path= pathT;
CGPathRelease(pathT);
}
三、脉冲效果动画
@property (weak, nonatomic) IBOutlet UIView pulseView;
@property(nonatomic,strong) CAShapeLayer pulseLayer;
-(void)pulseAnimation {
CGFloat width = selfpulseViewboundssizewidth;
selfpulseLayer = [CAShapeLayer layer];
selfpulseLayerbounds=CGRectMake(0,0, width, width);
selfpulseLayerposition=CGPointMake(width/2, width/2);
selfpulseLayerbackgroundColor = [UIColor clearColor]CGColor;
selfpulseLayerpath = [UIBezierPath bezierPathWithOvalInRect:selfpulseLayerbounds]CGPath;
selfpulseLayerfillColor = [UIColor colorWithRed: 03490196078 green:0737254902 blue:08039215686 alpha:1]CGColor;
selfpulseLayeropacity = 00;
CAReplicatorLayer replicatorLayer = [CAReplicatorLayer layer];
replicatorLayerbounds=CGRectMake(0,0, width, width);
replicatorLayerposition=CGPointMake(width/2, width/2);
replicatorLayerinstanceCount=4;// 复制层
replicatorLayerinstanceDelay=1;/// 频率
[replicatorLayeraddSublayer:selfpulseLayer];
[selfpulseViewlayeraddSublayer:replicatorLayer];
[selfpulseViewlayerinsertSublayer:replicatorLayeratIndex:0];
}
-(void)startPulseAnimation {
CABasicAnimation opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacityAnimationfromValue=@20;// 起始值 (strong 修饰的id值)
opacityAnimationtoValue=@30;// 结束值(strong 修饰的id值)
CABasicAnimation scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
scaleAnimationfromValue = [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DIdentity, 00, 00, 00)];
scaleAnimationtoValue =[NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DIdentity, 10, 10, 10)];
CAAnimationGroup groupAnimation = [CAAnimationGroup animation];
groupAnimationanimations=@[opacityAnimation, scaleAnimation];
groupAnimationduration=20;
groupAnimationautoreverses=NO;
groupAnimationrepeatCount=HUGE;
[selfpulseLayeraddAnimation:groupAnimationforKey:nil];
}
在此附上效果:
听说有好得三方库,我还没有去找过,欢迎各位大佬推荐一个优质的三方。。。。。
喜欢的朋友点个赞呗!
iOS所有继承UIView的类都有一个 CGAffineTransform 类型的属性 transform ,它是定义在二维空间上完成View的平移,旋转,缩放等效果的实现。这篇文章主要是展示所有值变化的效果。
1原始值
2修改a的值
3修改b的值
4修改c的值
5修改d的值
6修改tx的值
7修改ty的值
相信同学应该知道了它们每一个值的变化,这样就可以通过修改它们的值来完成你想要的动画效果。
①根据本身的 transform 进行平移 CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)
②根据本身的 transform 后者另外的 transform 进行平移 CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)
①根据本身的 transform 进行缩放
CGAffineTransformMakeScale(CGFloat sx,CGFloat sy)
②根据本身的 transform 后者另外的 transform 进行缩放
CGAffineTransformScale(CGAffineTransform t,CGFloat sx,CGFloat sy)
① 根据本身的 transform 进行旋转
CGAffineTransformMakeRotation(CGFloat angle) (angle 旋转的角度)
②根据本身的 transform 后者另外的 transform 进行旋转
CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)
CGAffineTransformInvert(CGAffineTransform t)
CGAffineTransformConcat(CGAffineTransform t1,CGAffineTransform t2)
两个 transform 合并起来
这个使我们自己定义
查看是不是默认的 transform
① Bool CGAffineTransformIsIdentity(CGAffineTransform t)
比较两个 transform 是否相等
② bool CGAffineTransformEqualToTransform(CGAffineTransform t1,CGAffineTransform t2)
① CGPointApplyAffineTransform(CGPoint point,CGAffineTransform t) 得到新的中心 CGPoint
② CGSizeApplyAffineTransform(CGSize size,CGAffineTransform t) 得到新的 size CGSize
③ CGRectApplyAffineTransform(CGRect rect,CGAffineTransform t) 得到新的 rect CGRect
放射矩阵一个常用的情形就是根据用户的手势来相应的改变视图的变换
UIPanGestureRecognizer 位移
UIPinchGestureRecognizer 缩放
UIRotationGestureRecognizer 旋转
苹果官方的建议,要多次使用 transform ,最好是初始化一个 CGAffineTransform ,进行多次 *** 作。
触摸事件一共有4个,一次完整的触碰,至少包括开始和结束两个事件
1 > 触摸开始 ,用手指(一根或者多根)按在屏幕上
2> 触摸移动 , 手指在屏幕上发生移动(有可能发生)
3> 触摸结束,手指从屏幕上离开
4> 触摸被取消,因为系统事件(比如电话)一次触摸事件被取消
属性:
1> view : 监测到触摸事件的视图,在开发中使用最为频繁的属性
2 > window : 窗口 ,发生触碰事件的窗口
3 > phase: 相位属性 ,在开发中使用很少,一般是用户自定义手势识别
4 > timestamp : 发生触摸的时间以上两个属性, 很少用到,一般都是自定义的手势
5 > tapcount :发生触摸时,在短时间时间内,手指点按的次数
方法 :
1 > locationInView : 发生触摸事件性对视图的位置
2 > previousLocationI女IE我: 发生触摸事件前一次手指所在的位置
1 > 发生触摸事件后,系统会将改事件加入到一个由UIApplication管理的事件队列中
2 > UIApplication会从事件队列中取出最前面的事件并将其分发以便处理,通常先发送事件给应用程序的主窗口
3> 主窗口会调用hitTest:withEvent:方法在视图继承树中找到一个最合适的子视图来处理触摸事件,该子视图即为hit-test视图
4> 如果hit-test视图不处理收到的事件消息,UIKit则将事件转发到响应者链中的下一个响应者,看其是否能对该消息进行处理
5>接收用户触摸响应的几个条件
1) selfuserInteractionEnabled =YES;允许接收用户响应
2) selfhidden = NO; 只有现实的视图才能接收用户触摸
3) selfalpha > 001; 视图的透明度一定要可见
提示:并不是所有的控件都默认接收用户交互的,譬如:UIImageView,UILabel等
6>参数说明
point 用户触摸的点,相对于当前视图坐标系的坐标点
event 用户触摸事件,开发中一般程序员不使用,该事件用于在响应者链条上传递
1>实例化手势识别 UITapGestureRecognizer()
2>设置手势识别属性 addTarget(target:AnyObject, action: Selector)
3>将手势识别附加到指定的视图 viewaddGestureRecognizer()
4>编写监听方法
1> UIGestureRecognizer 所有手势识别的父类,不允许直接使用,可以用来自定义手势
UITapGestureRecognizer(点按)
UIPinchGestureRecognizer(捏合)
UIPanGestureRecognizer(拖动)
UISwipeGestureRecognizer(轻扫)
UIRotationGestureRecognizer(旋转)
UILongPressGestureRecognizer(长按)
1> UITapGestureRecognizer 点按手势(离散手势,其他手势都是连续手势)
属性:
numberOfTapsRequired点击次数,单击双击
numberOfTouchesRequired 手指根数
2>UILongPressGestureRecognizer 长按手势
3> UIPanGestureRecognizer 拖动手势
属性:不常用
方法:
在视图中拖动的距离
public func translationInView(view: UIView) -> CGPoint
在视图中拖动的速度,通常可用于模拟惯性,需要一些物理方面的计算
public func velocityInView(view: UIView) -> CGPoint
拖动手指中的平移距离是相对于初始位置,如果使用CGAffineTransformTranslate累加形变方法
需要在每次位移之后,重置recognizer的位移量,就是将位移量清零
4> UIPinchGestureRecognizer 捏合手势
属性:
scale 比例
velocity 捏合速度,不常用
5>UIRotationGestureRecognizer 旋转手势
属性:
rotation 旋转角度
velocity 旋转速度,不常用
在形变时,iOS采取就近原则旋转,如果不能按照希望的方向旋转,可以增加一些修正值,例如001
直接通过形变属性,要实现一次性转一圈,比较困难,可以分两次进行
6> UISwipeGestureRecognizer 轻扫手势,通常添加到根视图上
属性:
numberOfTouchesRequired
参与轻扫手势的手指根数
direction
轻扫的方向
提示:
1) 如果要检测几个方向的轻扫,需要分别实例化几个轻扫手势
2) 轻扫手势虽然是连续手势,但是不需要去处理UIGestureRecognizerStateChanged状态
因为是在手指离开屏幕后,该手势才被识别的。
public enum UIGestureRecognizerState : Int {
// 没有触摸事件发生,所有手势识别的默认状态
case Possible
// 一个手势已经开始但尚未改变或者完成时
case Began
// 手势状态改变
case Changed
// 手势完成
case Ended
// 手势取消,恢复至Possible状态
case Cancelled
// 手势失败,恢复至Possible状态
case Failed
// 识别到手势识别
public static var Recognized: UIGestureRecognizerState { get }
}
UIView是所有UI控件的父类。UIView类的对象负责屏幕上一个矩形区域的显示和行为动作。我们熟知的UIButton,UIImageview等等都继承自UIView,因此,UIView所具备的属性和方法,其子类也都同样具备。
UIView类(视图类)负责管理屏幕上的一块矩形区域,包括这个区域内的显示样式,比如背景颜色,大小,以及行为动作,例如监测用户点击等触碰事件。
视图还可以用于管理一个或者多个子视图。用户看到的某个样式,有可能是多个视图叠加后的显示效果。视图的这种布局方式,也称为视图层次,一个父视图可以包含任意多个子视图。同时,父视图的属性有时也会影响到子视图的样式以及用户交互行为。
总体来讲,视图类的主要作用有如下3个方面:
样式显示与动画:负责自身矩形区域内样式的显示,以及某些属性(大小、位置、角度)变化时的动画过渡效果;
布局与子视图管理:管理子视图
事件处理:接收触摸事件。
在iOS开发中,UIView与UIViewController紧密协作,UIViewController负责UIView的加载与卸载。有关UIViewController的介绍,可以参考UIViewController相关教程: UIViewController介绍:1-创建控制器
2、UIKit族图
通过UIKit的族图可以看到,UIView继承自UIResponder,因此UIView可以响应用户交互。另外,我们熟知的一些常用控件都继承自UIView。需要特别说明的是,UIWindow也是继承自UIView,窗口可以认为是一个特殊的View。(有关UIWindow的知识,可以参见: UIWindow、UIView、UIViewController的关系 )
3、最常使用的UIView属性
在iOS开发中,有些UIView的属性是非常常用的,在此给大家简单列举一些,后面课程中会做详细讲解。
/UIView有关样式的常用属性/
@property(nonatomic)CGRectframe;
@property(nonatomic)CGRectbounds;
@property(nonatomic)CGPointcenter;
@property(nonatomic)CGAffineTransformtransform;
@property(nullable,nonatomic,copy)UIColorbackgroundColor;
@property(nonatomic)CGFloatalpha;
@property(nonatomic,getter=isHidden)BOOL hidden;
/UIView管理子视图的常用属性和方法/
@property(nullable,nonatomic,readonly)UIViewsuperview;
@property(nonatomic,readonly,copy)NSArraysubviews;
@property(nullable,nonatomic,readonly)UIWindowwindow;
-(void)removeFromSuperview;
-(void)addSubview:(UIView)view;
-(void)bringSubviewToFront:(UIView)view;
/UIView有关动画的属性和方法/
+(void)animateWithDuration:(NSTimeInterval)duration animations:(void(^)(void))animations completion:(void(^__nullable)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);
+(void)animateWithDuration:(NSTimeInterval)duration animations:(void(^)(void))animations NS_AVAILABLE_IOS(4_0);
/UIView有关交互的常用属性与方法/
@property(nullable,nonatomic,copy)NSArraygestureRecognizers;
-(void)addGestureRecognizer:(UIGestureRecognizer)gestureRecognizer;
-(void)removeGestureRecognizer:(UIGestureRecognizer)gestureRecognizer;
在我的app中,有一个登录页面ViewController,我在其中实现了shouldAutorotateToInterfaceOrientation方法,让它支持自动旋屏:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return interfaceOrientation == UIInterfaceOrientationPortrait ||
interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown;
}
这个方法工作得很好,当屏幕从正向模式旋转到倒置人像模式时,View Controller如预期旋转。
当登录完成,我用以下代码显示另一个View Controller:
iPadMainVC mainVC=[[iPadMainVC alloc]initWithNibName:@"iPadMainVC"
bundle:nil];
UINavigationController nController = [[UINavigationController alloc]initWithRootViewController:mainVC];
[nController setNavigationBarHidden:YES animated:NO];
selfviewwindowrootViewController = nController;
在这个View Controller(iPadMainVC)中,我把前面的shouldAutorotateToInterfaceOrientation方法代码复制粘贴进去了。
然而,当iPad旋转时,除了视图第1次load时以外,shouldAutorotateToInterfaceOrientation方法不会被调用。
我添加了一些打印语句在该方法中进行debug:
if (interfaceOrientation== UIDeviceOrientationPortrait) NSLog(@"Up");
if(interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) NSLog(@"Down");
程序运行时,在登录完成,刚刚进入iPadMainVC视图的时候,shouldAutorotate方法会调用3次:
以上就是关于UIView中常见的方法总结全部的内容,包括:UIView中常见的方法总结、iOS核心动画之图片旋转、脉冲动画、水波纹动画、iOS 仿射变换CGAffineTransform等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)