iOS复习记录日记04-从搭建出IOSUI最简单的计算器,到复杂的分布式服务端开发[2020]

前言

日记04
今天挺忙的.得到了一个提前的生日礼物 黑胶唱片Eason的.
然后我把我的iphone x max卖掉了, 我买了一部iphone 11. 还没发货.没手机用了现在

1.这篇日记是制作猜题小游戏,主要还是对基础控件的运用.

2.然后会实现一个喜马拉雅app和图片轮播器
图片的滚动! 缩放! uiscrollview组件. 非常重要 另外会配合UIPageControl控件的分页
最后还有一个NSTimer计时器控件的使用复习.
如果你仔细观察,几乎大多数app都会使用这两个组件,因为它们是非常重要的基础组件

正文

第一步肯定 肯定是要设置 状态栏的颜色了
-(UIStatusBarStyle)preferredStatusBarStyle{} 重写父类的方法
具体的枚举可以进类查看,设置状态栏的颜色, 因为我们毕竟是以复习 为主的.
-(BOOL)prefersStatusBarHidden{)重写父类的方法
隐藏状态栏了.
如果不想让组件产生相应,只想让它默默地展示数据.
设置user interaction enabled为no就可以了
如果想让uiimage有颜色边框的效果,很简单用内边距就可以了,记得把uiimage的背景颜色加颜色哦.
如果不想让uiimage在高亮的时候有反应. 属性highlighted adjust设置no就行了
重点:nsstring属性一定要设置copy… 不然常量区那些事,你懂我也懂.
如果是数组的count格式化时要用%ld去接受

第二部:点击实现大图的思路

需要阴影遮罩, 创建一个和屏幕一样大的view. 浅灰,渐变alpha
--------控制器<遮罩<图片按钮
创建的优先级很重要.
如果你看到了一行 xxx.fream = xx.bounds,那么bounds刚好x,y永远为0, 这个时候其实就是一个从0的大小赋值
UIVIew bringSubviewToFront :XX 让xx在uiview的全部子类中 带到最上层进行显示.
这个时候还需要一个全局的CGRect来记录上一次的值,在还原的时候需要的.
删除操作
view.subviews.firstObject 通过while可以获得全部的子控件 removeFromSuperview 可以进行移出了.讲过
view.subviews makeObjectsPerformSelector:@select(类方法); 这样也可以让数组里的每个对象分别调用SEL
新增属性
titleForState:枚举 ,拿到不同状态下按钮的文字
currentTitle 可以直接获得当前状态下的文字.
NSMutableString 操作字符串的 appendstring
-类 performselector:SEL withObject:参数 afterDelay:float //多少秒后调用哪个类的那个方法
UIAlertVIew已经过期了
**

代理

重点的重点
这是通过指针的特性. 类1 的id变量指针 指向了任意类 的 类2
类1调用了这个id属性的 类2的方法 传入参数 类2就执行了 但类1是在类2生成的.
一定要实现代理的协议. 和 Java中就是泛型差不多
协议内标注需要实现的方法, 类2进行协议实现.
我搞java时从未想过这样也行, 不过因为底层是c的强大, oc这样也能做到!
但是java中也有这样的实现, 多数框架也是如此的. 后来人写先前人的代码, 我想你应知道是什么了吧.
当时学完oc代理 我也才深深感受到代理的强大之处.
**

设置启动图片

由于目前不同的机型和ipad太多了 启动图片选项已经没有了
用提供的LaunchScreen.storyboard 加约束搞就行了. 约束会留到后面说

@2,@3的含义

iPhone的屏幕 分为 普通的屏幕, 视网膜屏幕,plus的视网膜屏幕
一张5050的像素的照片,在 这3个屏幕里面 播放! 他们占用的 屏幕 " 点" 都是一样的.
但是会非常的不清楚. 比如在普通的屏幕中 x10 y 10的 点 放入一个50
50的像素图片
和在视网膜的屏幕中 x10 y 10的 点 放入一个100*100的像素图片
最终你打开手机看到的图片大小 都是一样的… 只是清晰度不同… 因为苹果的屏幕是以点作为概念的.
这在windows上你很难以理解
但是这件事,让不同机型之间的屏幕适配,非常方便…

一个uiimage 大小是100100 ,在 iPhone 4的视网膜屏里面
你放入了一个200
200像素的图片, 那么它占用了100100的点,点里面的像素2
一个uiimage 大小是100100 ,在 iPhone 3的屏里面
你放入了一个100
100像素的图片, 那么它占用了100100的点,点里面的像素1
像素越高越清晰,但是整体大小是不变的.
这就是点是一样的,但是屏幕显示的异常清晰.还省事适配 apple视网膜属实是牛逼的,

我大约花了3小时时间,把猜题小游戏这边代码写了一遍 .
里面用上的代码水平 就是日记0到日记4的全部了.
唯一比较麻烦的只能说是计算坐标, 不过如果昨天写了九宫格例子,这也很简单就可以了.

阶段总结下

-(UIStatusBarStyle)preferredStatusBarStyle //设置状态栏颜色
-(BOOL)prefersStatusBarHidden{)//隐藏状态栏
新增方法
removeFromSuperview // 值得注意的是 父类移出后确保没强指针引用.
userInteractionEnabled //BOOL 交互设置
highlightedAdjust //BOOL 高亮反应 但并不会在自定义按钮类型中有作用.
bringSubviewToFront //UIVIew展示级带到父类子控件中的最高层
view.subviews //获得全部子控件返回ns数组
makeObjectsPerformSelector:SEL //让子类执行的SEL.
titleForState //按钮拿到不同状态的文字
currentTitle //按钮拿到当前状态下的文字
appendstring //可变的追加
performselector:SEL withObject:参数 afterDelay:float
什么类执行的此方法, 就会在这类中寻找SEL的加参数, 将在多少秒后执行.

UIScrollView

UIScrollVIew它是干什么的? 它是实现滚动和缩放的. 当你看一张大图片,你怎么向下滚动? 手指的捏合缩放变大变小
UIScrollVIew控件本身不会滚动缩放,是它里面的内容. 所以这个时候大小的设定不管uiscrollview什么事情了.
常见属性
contentSize 放到UiScrollView的内容有多大. 不希望那个方向滚动 给0就行
contentOffSet 默认开始,内容坐标偏移多少 CGPoint 也可以手动的获取,这样我们就可以时刻了解滚动的坐标
也可以通过程序自动滚动,自动翻页什么的,只需要更改cgpoint就可以了 注:有个参数可以设置是否动画
showsHorizontalScrollIndicator 设置是否显示滚动器. 就滚动条,bool类型
showsVerticalScrollIndicator 这个是设置垂直的滚动条 默认是显示的.
contentInset 内边距 四边设置就需要新的 数据类型UIEdgeInsets 结构体
设置content内边距并不会压缩子控件本身的空间 也没有增加改变本身的contentSize大小
你可以理解为这是个外边距的概念,这是没错的
UIEdgeInsets结构体{CGFLoat top,left,bottom,right} 相对比较重要的结构体
Bounces 设置弹簧属性是否需要.
CGRectGetMaxY 计算出最大Y的便捷方法
常用的代理方法
你想实时获得监听滚动的内容 ,就需要设置代理了. 系统类在滚动的时候就会调用你的方法
0.遵循UIScrollViewDelegate协议,并实现这个代理协议的需求方法.
1.设置scrollview.delegate=准守协议的类.
2.实现相对应的协议. 比如:开始拖拽,正在滚动,拖拽完毕. 这我就不太多写了,要什么协议直接进头文件看.
(void)scrollviewDidScroll 滚动的时候
(void)scrollviewwillbeginDragging 即将开始拖拽
(void)scrollviewdieEndDraggin 拖拽完毕后的
注意:协议中@optional 是可选的代理协议 @required是必须要求实现的
代理设计模式最终的目的就是 解耦
滚动缩放
1.设置缩放的是哪个控件 -(毕竟scroll里面可以放一大堆控件,谁也不知道缩放哪个…)
-(UIView *)viewForZoomingInScroollview //返回要进行缩放的子控件 代理方法
2.设置缩放比, 最大多少倍 最小多少倍
.maximumZoomScale 最大缩放倍数
minximumZoomScale 最小缩放倍数
附加:
(void)scrollviewDieENdZooming 缩放结束的代理方法
(void)scrollviewwillbeginzooming 即将开始缩放
(void)scrollviewdidzoom 正在缩放

分页效果:
.pagingEnable = yes //根据内容大小系统自动实现的.

UIPageControl

.numberOfPages 指定总页数
.currentPage 指定页数

NSTimer

NStimer (时间较大1秒 建议使用这个计时器)
调用timerWithxxx 创建的timer 需要手动加到 消息循环 才能启动
调用NStimer scheduledTimerWithInterval:每次间隔多少时间 target:那个对象 SEL userinfo:NIl repeats:是否重复执行
第二种方式创建的timer 创建出的timer 会自动启动执行
invalidate 停止计时器
设置timer的优先级 先获得NSRunLoop消息循环对象
NSRunLopp *rd = [NSunLoop currentRunLoop]
[rd addTimer:self.timer forMode:NSRunLoopCommonModes];
Timer的优先级是没有UI的优先级高的,如果UI在执行,TImer的计时器就会被暂停或者延迟. 把它加入消息循环内
让它的优先级和UI一样高.

CADislayLink(时间间隔小, 使用这个)

总结

起床在写,我太困了

发布了4 篇原创文章 · 获赞 0 · 访问量 1126

猜你喜欢

转载自blog.csdn.net/u014270781/article/details/105152636
今日推荐