UIView

屈星腾
2023-12-01

1.交互属性:userInteractionEnabled多数视图默认为YES,UIImageView的这个属性默认为NO。

   背景色的启用提供了一种方便的调试辅助来可视化每个视图的真实范围。

   contentStretch提供特定于视图的拉伸,可以实现拉伸后保持鲜明的边界。

 

3.视图动画块:

iPhone体验的精华之一就是巧妙而流畅的过渡。这可以让用户为屏幕上发生的模式变化做好准备。
UIView动画是作为完整的事物一次性运行,完美的建立起一座连接视图当前状态和未来状态的视觉桥梁。

UIView方式可能在底层也是使用CATransition,它只能用于一些简单常用的效果展现。

[UIView beginAnimations:nil context:NULL];//标记动画块开始
[UIView setAnimationDuration:5.0f];//以秒为单位指定动画时长。

[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//定义动画块加速减速的方式。

[UIView setAnimationTransition:UIViewAnimationTransition  forView:containerView cache:YES];//为containerView指定过渡类型,做containerView的子视图位置变化的效果。

......

[UIView commitAnimations];//标志动画块结束。

如果只是位置的平滑移动,设置好setAnimationDuration,然后再设置view的目录位置就可以了。一般设置view.center。

 

可以产生动画效果的变化包括:

位置变化;大小变化;伸缩变化;透明度变化;状态变化;顺序变化;旋转;

添加动画回调: setAnimationDelegate,setAnimatinDidStopSelector,

    4种UIView过渡效果:

    UIViewAnimationTransitionFlipFromLeft,//翻转
    UIViewAnimationTransitionFlipFromRight,
    UIViewAnimationTransitionCurlUp,//卷起,翻页
    UIViewAnimationTransitionCurlDown

摘自setAnimationTransition:forView:cache:介绍:

If you want to change the appearance of a view during a transition—for example, flip from one view to another—then use a container view, an instance of UIView, as follows:
(1).Begin an animation block.
(2).Set the transition on the container view.
(3).Remove the subview from the container view.
(4).Add the new subview to the container view.
(5).Commit the animation block.

也可以使用类方法transitionWithView:duration:options:animations:completion:,对程序块加过渡。

 

多个动画交叉运行时,尝试加上setAnimationBeginsFromCurrentState:YES。

4.CATransition

   Core Animation Transitions: 它是QuartzCore架构的一部分。

   每一个UIView包含一个CALayer, CALayer就是图层,图层的功能自然就有渲染图片, 播放动画的功能。单个层可以有很多子层

   CATransition只针对图层,不针对视图。图层是Core Animation与每个View产生联系的工作层面。

    一个UIView包含CALayer树,CALayer是一个数据模型,包含了一些用于显示的对象,但本身不用于显示。
    UIView真正的绘图部分,是由Core Animation Layer来管理。UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等,实际上内部都是在访问它所包含的CALayer的相关属性。
    http://blog.csdn.net/zypsg/article/details/6592629

    视图(UIView)的一个实例,有一个CALayer实例做为父层(superlayer) 以及在这层上添加的所有子层,创建的层结构称为layer tree(层之间的结构像一颗树)。在画层时,所有的层指定一个相对于父层的坐标,然后从最后一层往前画,就像画视图一样。层允许更复杂的转换,比如旋 转,倾斜,放大缩小,投影层的内容。

    http://www.cocoachina.com/macdev/objc/2010/0120/348.html

   4种CoreAnimation Transition过渡效果:

/* Common transition types. */

kCATransitionFade
kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal

/* Common transition subtypes. */

kCATransitionFromRight
kCATransitionFromLeft
kCATransitionFromTop
kCATransitionFromBottom

它的使用方法是创建CATransition,然后添加给层。不需要设置UIView动画块。例如下面这段代码产生这样的效果:view1右侧出现一个重影,它们同时向左移动view1宽度的距离。

CATransition *animation = [CATransition animation];
 [animation setDelegate:self];
 [animation setType:kCATransitionPush];//效果名称,NSString类型
 [animation setSubtype:kCATransitionFromRight];//效果名称,NSString类型
 [animation setDuration:1.0f];
 [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
 [[view1 layer] addAnimation:animation forKey:nil];

这可能是UIView中,两层layer的动画。

 

5.CABasicAnimation

CAAnimationGroup

CABasicAnimation

CAAnimation

CAAction


 

6.仿射变换:某个坐标系的点可以转换到另一个坐标系中。这种变换是Core Graphics实现的一部分。

    仿射变换不能自己单独形成动画(可能会利用NSTimer循环调用它而形成动画),要把它应用到UIView动画块当中去。

  设置transform属性:

   CGAffineTransformMakeRotation,

   CGAffineTransformMakeScale,

   CGAffineTransformScale,

   CGAffineTransformIdentiry,

 

下面实现从0.1放大到1.15动画。注意缩放以后view1的bounds属性的值没变。

view1.transform = CGAffineTransformMakeScale(0.01f, 0.01f);//CGAffineTransform

// Bounce to 115% of the normal size
 [UIView beginAnimations:nil context:UIGraphicsGetCurrentContext()];
 [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
 [UIView setAnimationDuration:0.4f];
 view1.transform = CGAffineTransformMakeScale(1.15f, 1.15f);

 

可能只设置transform就会有动画出现,另外有仿射组合可以参考使用。

 

 

 

10.模态动画:使用CFRunLoopRun自定义实现。

 

 

5.框架

NSPoint,NSSize,NSRect是MAC OS X的api。

在iphone中使用CGPoint,CGSize,CGRect结构. CG是Core Graphics的缩写。

一些全局函数帮助处理框架:

CGRectIntersectsRect判断两个矩形是否相交。

bool CGRectContainsPoint(CGRect rect, CGPoint point)

和CGRectMake一样,它们在CGGeometry.h头文件中声明。

CGRectGetMidX获取中间x值,还有其它一些函数获取矩形的各个位置参数。

UIEdgeInsetsInsetRect();

取rect的中间部分:rect=CGRectInset(rect, 0, rect.size.height/3);
UIEdgeInsetsMake();
iPhone SDK更希望通过改变视图的center属性来移动视图,

alpha透明度,值为0时完全透明,值为1时完全不透明。

 

 

6.同一个view不能被添加到多个view中,否则后面的不会显示。


7.自动尺寸调整行为

   autoResizesSubviews默认为YES,然后再设置autoresizingMask的值。

   UIViewAutoresizingFlexibleHeight   视图的高度和父视图的高度一起成比例变化。否则,视图的高度将保持不变。
   UIViewAutoresizingFlexibleWidth    视图的宽度和父视图的宽度一起成比例变化。否则,视图的宽度将保持不变。

例:[self.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth & UIViewAutoresizingFlexibleHeight];

详见:  http://www.apple.com.cn/developer/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/WindowsandViews/WindowsandViews.html


8.

千万不要用timer,mac和iPhone上面很多效果很酷,就是因为系统提供了core animation,方便程序员写出来很酷的效果,这是标准玩法,而且不用费劲。千万不要自己实现动画效果。

大多数转换,都可以用这个方式实现动画效果,很方便的。

iOS 做动画的途径有三个:
1,UIView 动画,最简单的,就是Tiny上面演示的,基本上满足大部分需求

2,Core Animation 稍微复杂一点,可以设置关键帧等

2,OpenGL 最复杂,执行效率也最高

4.0以后可以用block,代码变成2行了。

label1.alpha = 0;
[UIView animateWithDuration:1 animations:^{ label1.alpha = 1; } completion:^(BOOL finished){ }];

 

 类似资料: