首页 > 其他分享 >iOS开发系列课程(03) --- UIView详解

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

时间:2023-06-20 14:35:44浏览次数:61  
标签:03 动画 iOS UIImageView 视图 --- CALayer 方法 UIView


深入UIView

MVC架构模式

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

UIView的常用属性和方法

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

  绘制和更新视图的方法

  • -drawRect:方法:绘图(可以使用贝塞尔曲线进行绘图)
  • -setNeedsDisplay方法:让整个视图重绘
  • -setNeedsDisplayInRect:方法:让视图指定的矩形区域重绘

  管理手势操作的方法

  • -addGestureRecognizer:方法:添加手势识别器
  • -removeGestureRecognizer:方法:删除手势识别器

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

  • +animateWithDuration:animations:类方法:用指定的持续时间完成通过Block指定的动画

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

  • +beginAnimations:context:类方法:开始一个动画
  • +commitAnimations类方法:执行动画
  • +setAnimationStartDate:类方法:设置动画开始时间
  • +setAnimationDuration:类方法:设置动画持续时间
  • +setAnimationDelay:类方法:设置延迟多少时间播放动画
  • +setAnimationRepeatCount:类方法:设置动画重复播放次数
  • +setAnimationRepeatAutoreverses:类方法:设置是否反向执行动画
  • +setAnimationTransition:forView:cache:类方法:设置动画的执行效果以及作用于哪个视图

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

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

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

iOS开发系列课程(03) --- UIView详解_子视图

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

  • -addMotionEffect:方法:添加运动视觉效果
  • -removeMotionEffect:方法:删除运动视觉效果

  通过标识获得UIView

  • -viewWithTag:方法:通过指定的标识值获取视图

  转换坐标系统的方法

  • -convertPoint:toView:方法:将当前视图上的坐标转换为指定视图上的坐标,如果第二个参数为nil,则转换成窗口坐标
  • -convertPoint:fromView:方法:将指定视图上的坐标转换为当前视图的坐标

  视图碰撞检测方法

  • -hitTest:withEvent:方法:获得一个点所在的视图上,如果当前视图包含这个点则返回点所在的最远子视图,如果当前视图不包括这个点则返回nil
  • -pointInside:withEvent:方法:判断一个点有没有在当前视图上

  视图相关的回调方法

  • -didAddSubview:方法:添加子视图的回调方法
  • -willRemoveSubview:方法:移除子视图的回调方法
  • -willMoveToSuperview:方法:视图将要移到某个父视图的回调方法
  • -didMoveToSuperview:方法:视图已经移到某个父视图的回调方法
  • -willMoveToWindow:方法:视图将要移到UIWindow对象的回调方法
  • -didMoveToWindow:方法:视图已经移到UIWindow对象的回调方法

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

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

iOS开发系列课程(03) --- UIView详解_回调方法_02

提示:每一个子视图只能有一个父视图,当我们将一个子视图添加到另一个父视图上面时,它会脱离原来的父视图。另外,我们指定子视图的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的形状

  • borderColor属性:边框颜色。
  • borderWidth属性:边框宽度。
  • cornerRadius属性:边框转角半径(实现圆角效果)。

通过CALayer添加动画效果

  • transforms属性:指定对CALayer中的内容做怎样的变换,支持3D效果和动画。

UIImageView的使用

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

UIImageView的创建和使用

  • -initWithImage:方法:这种方式适合创建小图片,尤其是素材类图片。

UIImageView的常用属性和方法

  • contentMode属性:图片的填充模式。(继承自UIView)
  • clipsToBounds属性:修剪超出边界的部分。(继承自UIView)
  • animationImages属性:装在用于动画的图像的数组。
  • animationDuration属性:动画播放的持续时间。
  • animationRepeatCount属性:动画的重复次数,0表示循环播放。
  • -startAnimating方法:开始播放动画。
  • -stopAnimating方法:停止播放动画。
  • -isAnimating方法:返回BOOL值表示动画是否正在播放中。

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

iOS开发系列课程(03) --- UIView详解_子视图_03

iOS开发系列课程(03) --- UIView详解_类方法_04

#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


标签:03,动画,iOS,UIImageView,视图,---,CALayer,方法,UIView
From: https://blog.51cto.com/u_16166070/6522320

相关文章

  • iOS开发系列课程(07) --- 分栏视图控制器
    UITabBarController的使用  UITabBarController是如下所示的视图控制器,有人叫它分栏视图控制器,也有人叫它选项卡控制器或页签视图控制器(通常我不称它为标签视图控制器主要是为了避免和UILabel标签混淆),它是在很多App种都能见到的一种视图控制器,如下图所示。  使用UITabBarContro......
  • iOS开发系列课程(08) --- 事件处理详解和手势操作
    iOS中的事件分发事件的分类TouchEvents(多点触摸事件)touchesBegan:withEvent:方法:一个或多个手指置于视图或窗口上touchesMoved:withEvent:方法:一个或多个手指在移动touchesEnded:withEvent:方法:一个或多个手指离开视图或窗口touchesCancelled:withEvent:方法:如果其他系统事件(如内......
  • Python开发系列课程(2) - 语言元素
    语言元素指令和程序计算机的硬件系统通常由五大部件构成,包括:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器放在一起就是我们通常所说的中央处理器,它的功能是执行各种运算和控制指令以及处理计算机软件中的数据。我们通常所说的程序实际上就是指令的集合,我们写程......
  • iOS开发系列课程(05) --- 导航视图控制器
    简介  导航视图控制器是一个特殊的容器视图控制器,它可以维护有明确层次关系的视图之间的切换。我们可以打开模拟器或者你的iPhone看看设置功能,这里就是一个典型的对导航视图控制器的应用,如下图所示。很明显,导航视图控制器维护了一个栈结构,这是一种先进后出(FILO)的结构,我们将一个一......
  • iOS开发系列课程(09) --- 滚动视图
    UIScrollView入门  移动设备的屏幕⼤小是极其有限的,因此直接展⽰在⽤户眼前的内容也相当有限,当展⽰的内容较多超出一个屏幕时,用户可通过滚动操作来查看屏幕以外的内容,普通的UIView不具备滚动功能,不能显⽰过多的内容。UIScrollView是一个能够滚动的视图控件,可以⽤用来展⽰大量的......
  • iOS开发笔记 - 用CocoaPods管理第三方库
    在iOS项目中使用第三方类库可以说是非常常见的事,但是要正确配置这些第三方库会非常的繁琐,还好我们有CocoaPods来做这件事情,就如同在Java的世界里有Maven和Gradle,当然Maven的作用不仅仅是第三依赖库管理。通过CocoaPods工具我们可以为项目添加被称为"Pods"的依赖库(这些类库必须是Coc......
  • iOS开发笔记 - App上架流程(视频分享)
    具体的文档可以看一下我的《iOS开发笔记-上线流程》iOS项目上线流程视频百度云盘分享下面是一些相关的官方文档:https://developer.apple.com/app-store/review/guidelines/-项目审核指南http://www.apple.com/legal/intellectual-property/guidelinesfor3rdparties.htmlhttps......
  • 【资料分享】Xilinx XCZU7EV工业核心板规格书(四核ARM Cortex-A53 + 双核ARM Cortex-R5
    1核心板简介创龙科技SOM-TLZU是一款基于XilinxUltraScale+MPSoC系列XCZU7EV高性能处理器设计的高端异构多核SoC工业核心板,处理器集成PS端(四核ARMCortex-A53+双核ARMCortex-R5)+PL端UltraScale+架构可编程逻辑资源,支持[email protected]/H.265视频硬件编解码,并支持SATA大容量......
  • 威纶tk6070ik与台达变频器vdf-s485通讯程序 自己编写的威纶触摸屏与台达变频器的通讯
    威纶tk6070ik与台达变频器vdf-s485通讯程序自己编写的威纶触摸屏与台达变频器的通讯程序,可以直接控制变频器正反转,启动停止,监视变频器的电流电压等及错误代码等。威纶TK6070IK和台达变频器VDF-S485之间的通讯程序是由我自己编写的。通过这个程序,我能够直接控制变频器的正反转、启......
  • 使用docker-compose同时启动MySQL和Redis
    环境查看安装docker和docker-composeapt-yinstalldocker.iodocker-compose设置docker-compose配置文件root@iZ2zebcd9hncu1371fetliZ:/data/docker-compose#pwd/data/docker-composeroot@iZ2zebcd9hncu1371fetliZ:/data/docker-compose#catdocker-compose.ymlvers......