第五天,uiscorllview的滚动和缩放,以及代理调用,定时器,对话框

 

1.UIScrollView使用

- UIScrollView 介绍

  1> UIScrollView是一种控件,继承自UIView

  2> 用来实现”滚动”和”缩放”的控件

 

- UIScrollView设置滚动的基本步骤(进行滚动和缩放的是内容)

   1>创建一个UIScrollView

   2>向UIScrollView中添加内容(UIimageView)

   3>设置UIScrollView的内容的大小(contentSize)

 

- UIScrollView实现图片滚动(参考案例:大图片展示)

    1>拖一个 UIScrollView 到屏幕

   2> 拖一个 UIImageView 到 UIScrollView 中

   3> 设置 UIImageView 的显示图片, 并根据实际设置的图片的大小修改 UIImageView 的大小

   4> 在控制器的 viewDidLoad 方法中, 设置 UIScrollView 的 contentSize 为图片的实际大小(UIImageView的 Image 属性的 size)

 

- UIScrollView无法滚动可能的原因及解决办法分析

* 没有设置contentSize

*scrollEnabled = NO

* 没有接收到触摸事件:userInteractionEnabled = NO

* 没有取消autolayout功能等原因

 

- UIScrollView frame.size  contentSize 的区别

*frame.size指的是: UIScrollView的可视区域的大小, UIScrollView本身的大小

*contentSize指的是: UIScrollView中所包含的内容的大小(要滚动的实际内容的大小)

* 总结: 在UIScrollView的frame.size这么大的范围内, 要显示contentSize这么大的内容。是否需要滚动, 取决于contentSize是否比frame.size大

 

- UIScrollView常见属性

*contentSize (内容尺寸)

 

*contentOffset(内容偏移量,CGPoint类型)

含义:

1>当UIScrollView内部的内容滚动时, 内容相对于UIScrollView左上角的偏移

2>另一种理解方式: 内容滚动到了什么位置

 

** 注意: 可以通过代码来设置这个属性的值, 就相当于是通过代码实现滚动了(无需用户手指来触摸滚动)

 

* contentInset(内容的内边距,UIEdgeInset类型

含义:

1>设置UIScrollView的内容在拖动以后, 内容距离UIScrollView的内边距。(联想按钮的内边距属性:Inset)

2>另一种思考方式: 想象成把内容加大了, 在内容本身的周围加了一圈”外边距”。

 

- UIScrollView 其他属性

@property(nonatomic) BOOL bounces;

设置UIScrollView是否需要弹簧效果

 

@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;

设置UIScrollView是否能滚动

 

@property(nonatomic) BOOL showsHorizontalScrollIndicator;

是否显示水平滚动条

 

@property(nonatomic) BOOL showsVerticalScrollIndicator;

是否显示垂直滚动条

 

 

-监听控件的事件方法:

   *  1>通过addTarget:的方式来监听事件(前提是这个控件是继承自UIControl)

   *  2>通过代理的方式来监听事件

 * 3> 通知

- 代理设计模式在 UIScrollView 中的应用

* 通过代理来监听事件

* 设置代理可以通过"拖线"的方式或者是代码的方式

 

- 通过"代码""拖线"的方式设置代理

     *  设置代理的基本步骤:

    *  1. scroll view 设置delegate属性(设置代理对象)

    *  2. 让代理对象遵守代理协议

    *  3. 让代理对象, 实现协议中的方法

 

 

 

- UIScrollView常用代理方法

// 用户开始拖拽时调用

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

 

// 滚动到某个位置时调用

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;

 

// 用户结束拖拽时调用

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollViewwillDecelerate:(BOOL)decelerate;

 

// 用户使用捏合手势时调用

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

 

即将开始缩放的时候调用

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollViewwithView:(UIView *)view

 

正在缩放的时候调用

(void)scrollViewDidZoom:(UIScrollView *)scrollView

 

缩放完毕的时候调用

- (void)scrollViewDidEndZooming::(UIScrollView *)scrollView

 

- 代理设计模式的总结(UIAlertViewUIActionSheetUIScrollView都是通过代理来监听事件的)

 

- 通过 UIScrollView 实现多个子控件的滚动

* 参考案例:喜马拉雅

1> 拖拽一个UIScrollView到控制器view, 设置该UIScrollView大小与控制器view一致;

2> 设置该UIScrollView的背景色为浅灰色;

3> 向UIScrollView中增加内容;

4> 设置UIScrollView的contentSize的height为最下面的图片的最大的Y值再加间距, width为0(因为横向不滚动);

** 注意: 某个方向上不希望滚动, 则把该方向上的contentSize的值设置为0

5> 向控制器的view中添加一个UIView到最上方, 模拟"导航栏"(x = 0, y = 0, w = self.view.frame.size.width, h =64)

** 这直接拖拽会把这个UIView拽到UIScrollView, 这样就会让UIView随着UIScrollView进行滚动,所以需要调整层级为UIScrollView的同层级。

6> 设置顶部"导航栏"(64高) 与 底部 "菜单栏"(49高)的alpha = 0.6 (设置透明度);

7> 设置contentInset属性的top和bottom的值, 在滚动后预留一定的内边距

** 注意: 获取某个控件的最大的Y:CGRectGetMaxY(self.lastButton.frame)加边距;

8> 设置一开始就滚动到y 为某个值的位置, 通过contentOffset属性实现

** 注意这里要把y值设置为负数,向上滚动

** 该案例的主要目的:

1> 了解UIScrollView的基本使用

2> 深入了解contentSize、contentInset、contentOffset属性的作用和含义

 

 

-  图片轮播器

1、整体思路:

1>添加 UIScrollView

2>动态向 UIScrollView 中添加图片框(横向)

3>设置 UIScrollView 的 contentSize 实现滚动, 实现横向滚动

4>实现分页

5>实现分页指示器 UIPageControl

   2、具体步骤:

1>创建一个UIScrollView, 设置宽为300, 高为130 (与每张图片的大小一致)

2>向UIScrollView中添加内容(要滚动的内容, 添加到UIScrollView的子控件集合中)

循环添加5个UIImageView, 设置图片, 设置 frame

3>设置UIScrollView的contentSize的width为5个图片的总大小, 上下不滚动所以height为0

4>去掉水平滚动条

self.scrollView.showsHorizontalScrollIndicator= NO;

5>实现自动分页

self.scrollView.pagingEnabled= YES;

问题: 设置完pagingEnabled = YES以后,scrollView是怎么知道该如何分页的?

答: 按照UIScrollView自身的宽度来实现分页的.UIScrollView的宽度就是每页的大小。

 

6>显示分页指示器

1) 通过UIPageControl来实现

2) 拽一个UIPageControl放到控制器的view中, 不要放到UIScrollView中, 否则就一起滚动了.

3) 设置UIPageControl的Tint Color(其他页颜色)和Current Page(当前页颜色)属性颜色

 

注意: 当把UIPageControl添加到控制器的view中的时候, 这个控件和UIScrollView根本没有任何联系, 所以没有分页指示功能

 

7>实现分页指示器总页数、当前页。

总页数: numberOfPages属性

self.pageControl.numberOfPages= imageCount;

当前页: currentPage属性

self.pageControl.currentPage= 0;

 

注意:

在 viewDidLoad 中设置总页数

在- (void)scrollViewDidScroll:代理方法中设置当前页

设置当前页的思路:

通过当前的滚动的偏移值来计算出当前滚动到第几页了

 

8>通过定时器(NSTimer)实现自动滚动

在 viewDidLoad 中启动定时器

启动定时器的两种方法:

1) 调用timerWithXxx创建的timer,把这个timer对象手动加到”消息循环”中才能启动

2) 调用scheduledTimerWithXxx创建的timer,自动启动(创建完毕后自动启动)。

 

9>在定时器的方法中实现滚动, 代码参考备注。

思路1:

1) 通过 UIPageControl 获取当前页数, 并让页数+1

2) 根据加1以后的页数乘以每页的宽度(每张图片宽度)计算出contentOffset.x 的偏移值

3) 手动设置偏移值, 实现滚动 (通过动画方式设置).

 

10>解决Bug

Bug:当拖拽UIScrollView的时候, 保持一段时间不松手的时候, 一旦松手UIScrollView会连续滚动多次。

解决思路:在即将拖拽的时候, 停止计时器, 拖拽完毕后再打开一个计时器。

 

**停止计时器:调用 NSTimer 对象的 invalidate 方法(当某个计时器被停止以后, 就无法再重用了, 下次必须再重新创建一个新的计时器)。[self.timer invalidate];

 

11>解决Bug

Bug:当单击(拖拽)界面上的某个其他控件的时候, UIScrollView停止滚动的问题。

产生 Bug 的原因:

当前处理UI界面的只有一个线程, 当这个线程处理UI的拖动事件的时候就没有能力再去处理滚动操作了

注意: 处理UI界面的的只能是一个线程。所以, 处理UIScrollView的滚动和其他控件的拖拽, 只能用同一个线程。如果多个线程都可以操作 UI 那么就会造成混乱的问题

解决思路: 提高处理滚动的timer的优先级。

注意: 所有控件的默认优先级都是NSRunLoopCommonModes ,但是网络和计时器对象默认的优先级要比控件的优先级低是NSDefaultRunLoopMode , 所以这里要把计时器的优先级调整为与控件一样的优先级NSRunLoopCommonModes。

 

- NSTimer计时器控件/通过使用 Nstimer 实现自动滚动

两种不同的定时器

1> NSTimer(时间间隔比较大1秒,几秒)

2> CADisplayLink(时间间隔比较小,0.0几秒等)

创建、启动定时器代码参考:

// 方式一

[NSTimer scheduledTimerWithTimeInterval:0.5target:self selector:@selector(nextImage) userInfo:nil repeats:YES];

 

// 方式二

// 创建 NSTimer 对象

NSTimer *timer = [NSTimertimerWithTimeInterval:1.0 target:self selector:@selector(test1) userInfo:nilrepeats:YES];

   

// 将刚创建的 NSTimer 对象加到消息循环中, 这样就会自动启动定时器

NSRunLoop *runLoop = [NSRunLoopcurrentRunLoop];

[runLoop addTimer:timerforMode:NSRunLoopCommonModes];

 

// 方式三

// 创建计时器对象

NSTimer *timer = [NSTimertimerWithTimeInterval:1.0 target:self selector:@selector(test1) userInfo:nilrepeats:YES]

 

// 每次调用一次 fire 执行一次 test1方法

[timer fire]; // 执行一次 test 方法

[timer fire]; // 执行一次 test 方法

[timer fire]; // 执行一次 test 方法

[timer fire]; // 执行一次 test 方法

 

 

- UIScrollViewUIPageControl的分页

*UIPageControl 基本使用

*UIPageControl 的常见属性:

一共有多少页

@property(nonatomic)NSInteger numberOfPages;

 

当前显示的页码

@property(nonatomic)NSInteger currentPage;

 

只有一页时,是否需要隐藏页码指示器

@property(nonatomic) BOOL hidesForSinglePage;

 

其他页码指示器的颜色

@property(nonatomic,retain) UIColor *pageIndicatorTintColor;

 

当前页码指示器的颜色

@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;

 

- 解决图片轮播器的2 Bug

Bug1:当单击(拖拽)界面上的某个其他控件的时候, UIScrollView停止滚动的问题。

Bug2:当拖拽UIScrollView的时候, 保持一段时间不松手的时候, 一旦松手UIScrollView会连续滚动多次。

 

 

 

- UIAlertView/UIActionSheet使用(巩固代理的使用)

 

- UIAlertController介绍

 

- 启动图片与控制器大小关系

 

- 介绍为什么 UI 控件的 delegate 属性必须要使用 weak

// 所有UI控件的代理属性(一般情况下叫:delegate属性), 都必须使用weak来修饰

 

- 介绍拖线时, UI 控件为什么weak 来修饰

// 当界面上的控件, 要通过一个属性来访问的时候, 一般情况下, 这个属性的修饰符是weak

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值