素材巴巴 > 程序开发 >

iOS开发系列课程(03) --- UIView详解

程序开发 2023-09-12 09:59:50

深入UIView

MVC架构模式

  MVC(Model-View-Controller)是实现数据和显示数据的视图分离的架构模式(有一定规模的应用都应该实现数据和显示的分离)。其中,M代表模型,就是程序中使用的数据和状态,它不理会用户界面或表现方式,只负责数据和状态的存储;V代表视图,是呈现给用户看的东西,当然用户也可以通过视图来表达想要进行的操作;C代表控制器,它负责协调模型和视图,当模型更改时要刷新视图,这通常会包含一些逻辑。

UIView的常用属性和方法

  在第一天的课程中我们已经说过,UIView可以代表屏幕上的一块矩形区域,它负责内容的显示、定位以及响应用户的触摸事件,是用户和应用进行交互的主要方式,我们来看看第一天没有提到的关于UIView的属性和方法。

  绘制和更新视图的方法

  管理手势操作的方法

  使用Block语法设置动画的类方法

  为视图添加动画效果的类方法

说明:UIView动画只能修改关于坐标系统的属性以及色彩和透明度。

  下面的例子演示了一个扯日历的动画效果。

    [UIView beginAnimations:nil context:nil];[UIView setAnimationDuration:2];[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.superview cache:YES];[self removeFromSuperview];[UIView commitAnimations];

这里写图片描述

  与运动视觉效果相关的方法

  通过标识获得UIView

  转换坐标系统的方法

  视图碰撞检测方法

  视图相关的回调方法

  下面的例子演示了将一个视图伸缩后再旋转的动画效果。

    // 横向拉伸1.5倍,纵向拉伸0.5倍view.transform = CGAffineTransformMakeScale(1.5, 0.5);// 在刚才的变换的基础上再旋转30度view.transform = CGAffineTransformRotate(view.transform, M_PI / 6);

这里写图片描述

提示:每一个子视图只能有一个父视图,当我们将一个子视图添加到另一个父视图上面时,它会脱离原来的父视图。另外,我们指定子视图的frame、bounds等属性时,它的值是相当于父视图的相对值,而不是屏幕的绝对值,如果父视图改变了位置,那么这些子视图也会跟着改变。父视图如果设置了隐藏或者透明效果,肯定也会影响到子视图。子视图超出父视图的部分,是不能够接受事件的。

  如果需要从父视图中批量删除子视图,可以使用下面的代码:

NSArray *subViews = self.subViews;
 if([subViews count] != 0) {[subViews makeObjectPerformSelector:@selector(removeFromSuperview)];
 }

CALayer

UIView和CALayer的关系

  UIView和CALayer是相互依赖的关系,UIView依赖与CALayer提供的内容,CALayer依赖UIView提供的容器来显示绘制的内容。CALayer基于图像管理内容并允许你在这些内容上创建动画。如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。一言以蔽之,UIView来自CALayer,高于CALayer,是CALayer高层实现与封装;UIView的很多特性都源于CALayer对它的支持。

通过CALayer改变UIView的形状

通过CALayer添加动画效果

UIImageView的使用

  UIImageView对象提供了一个基于视图的容器来展示一张或者一系列图像,同时也支持以动画的方式来呈现一组图像(可以指定播放间隔和频率)。简单的说,UIImageView就是UIImage对象的承载者,当需要将UIImage呈现在UIView上时就需要UIImageView。二者的关系就像UILabel和NSString之间的关系。

UIImageView的创建和使用

UIImageView的常用属性和方法

  下面用UIImageView来实现一个动画,完成后的效果如下图所示。

这里写图片描述

这里写图片描述

#import "ViewController.h"@interface ViewController () {NSTimer *timer;
 }@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 用一个数组来装构成动画的所有图片NSMutableArray *imageArray = [NSMutableArray array];for (int i = 0; i < 6; i++) {[imageArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"runner%d.jpg", i]]];}// 创建UIImageView对象并指定相关的动画图片UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 150, 75, 100)];imageView.animationImages = [imageArray copy];// 设置图片切换的时间间隔imageView.animationDuration = 0.5;imageView.tag = 101;// imageView.animationRepeatCount = 10;// 开始动画[imageView startAnimating];[self.view addSubview:imageView];// 启动一个计时器让UIImageView向右移动timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(runAhead) userInfo:nil repeats:YES];
 }// 修改UIImageView的x坐标使其向右移动并在到达边界时返回
 - (void) runAhead {UIImageView *currentView = (id)[self.view viewWithTag:101];CGRect rect = currentView.frame;rect.origin.x += 1;if(rect.origin.x > self.view.bounds.size.width) {rect.origin.x = -75;}currentView.frame = rect;
 }@end

标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。