第一課
1UIApplication
2.PCH的配置
3.注冊推送
以下分別是 iOS 10 之前和之后的注冊方式期虾,其中的 UNAuthorizationOptions 里還可以找到 1 個 UNAuthorizationOptionCarPlay 的值是專為車載系統(tǒng)定制的值业踢。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//iOS 10 before
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
//iOS 10
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!error) {
NSLog(@"request authorization succeeded!");
}
}];
return YES;
}
作者:pikacode
鏈接:http://www.reibang.com/p/2f3202b5e758
來源:簡書
著作權歸作者所有昆庇。商業(yè)轉載請聯(lián)系作者獲得授權帮辟,非商業(yè)轉載請注明出處。
4.UIWindows
- 在程序當中,狀態(tài)欄和鍵盤,它都屬性是 個窗 .可以通過打印的 式來驗證. 設置window的層級.UIWindowLevelNormal它是 個CGFloat類型. self.window.windowLevel = UIWindowLevelNormal UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
5.從Storyboard加載控制器
第二課
第三課
1.segue的底層實現(xiàn)
2.通知
當控制器銷毀是記得移除通知
第四課
1.個人詳情頁代碼
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.dataSource = self;
self.tableView.delegate = self;
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
//NSLog(@"%@",NSStringFromCGRect(self.tableView.frame));
//1.凡是在導航條下面的scrollView.默認會設置偏移量.UIEdgeInsetsMake(64, 0, 0, 0)
//self.tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
//不要自動設置偏移量
self.automaticallyAdjustsScrollViewInsets = NO;
//讓導航條隱藏
//self.navigationController.navigationBar.hidden = YES;
//導航條或者是導航條上的控件設置透明度是沒有效果.
//self.navigationController.navigationBar.alpha = 0;
//設置導航條背景(必須得要使用默認的模式UIBarMetricsDefault)
//當背景圖片設置為Nil,系統(tǒng)會自動生成一張半透明的圖片,設置為導航條背景
[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
[self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]];
//當調用contentInset會自動調用scrollViewDidScroll
self.tableView.contentInset = UIEdgeInsetsMake(244, 0, 0, 0);
//設置標題
UILabel *title = [[UILabel alloc] init];
title.text = @"個人詳情頁";
[title sizeToFit];
title.textColor = [UIColor colorWithWhite:0 alpha:0];
self.navigationItem.titleView = title;
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
//求偏移量
//當前點 - 最原始的點
NSLog(@"%f",scrollView.contentOffset.y);
CGFloat offset = scrollView.contentOffset.y - oriOfftY;
NSLog(@"offset======%f",offset);
CGFloat h = oriHeight - offset;
if (h < 64) {
h = 64;
}
self.heightConstr.constant = h;
//根據(jù)透明度來生成圖片
//找最大值/
CGFloat alpha = offset * 1 / 136.0;
if (alpha >= 1) {
alpha = 0.99;
}
//拿到標題
UILabel *titleL = (UILabel *)self.navigationItem.titleView;
titleL.textColor = [UIColor colorWithWhite:0 alpha:alpha];
//把顏色生成圖片
UIColor *alphaColor = [UIColor colorWithWhite:1 alpha:alpha];
//把顏色生成圖片
UIImage *alphaImage = [UIImage imageWithColor:alphaColor];
//修改導航條背景圖片
[self.navigationController.navigationBar setBackgroundImage:alphaImage forBarMetrics:UIBarMetricsDefault];
}
2.歸檔
第五課
1.事件傳遞
- 1.當一個控件如果它的父控件不能夠接收事件,那么它里面子控件也是不能接收事件的
- 2.當一個控件隱藏的時候,它里面的子控件也跟著隱藏
- 3.當一個控件透明的時候,它里面的子控件也跟著透明
模擬系統(tǒng)的hitText方法
//作用:去尋找最適合的View
//什么時候調用:當一個事件傳遞給當前View,就會調用.
//返回值:返回的是誰,誰就是最適合的View(就會調用最適合的View的touch方法)
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
//1.判斷自己能否接收事件
if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) {
return nil;
}
//2.判斷當前點在不在當前View.
if (![self pointInside:point withEvent:event]) {
return nil;
}
//3.從后往前遍歷自己的子控件.讓子控件重復前兩步操作,(把事件傳遞給,讓子控件調用hitTest)
int count = (int)self.subviews.count;
for (int i = count - 1; i >= 0; i--) {
//取出每一個子控件
UIView *chileV = self.subviews[i];
//把當前的點轉換成子控件從標系上的點.
CGPoint childP = [self convertPoint:point toView:chileV];
UIView *fitView = [chileV hitTest:childP withEvent:event];
//判斷有沒有找到最適合的View
if(fitView){
return fitView;
}
}
//4.沒有找到比它自己更適合的View.那么它自己就是最適合的View
return self;
}
//作用:判斷當前點在不在它調用View,(誰調用pointInside,這個View就是誰)
//什么時候調用:它是在hitTest方法當中調用的.
//注意:point點必須得要跟它方法調用者在同一個坐標系里面
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
NSLog(@"%s",__func__);
return YES;
}
2.抽屜效果
第六課
1.定時器
1. 先要了解setNeedsDisplay
setNeedsDisplay底層會調 DrawRect 法重繪. 但是它不是 就進 重繪.它僅僅是設置了 個重繪標志,等到下 次屏幕刷新的時候才會 調 DrawRect 法.
如果使 NSTime的話,假設是0.01調 次重繪.假設屏幕0.02秒的時候它才刷新 次. 中間就會等0.01秒.
也就是每次都會等0.01秒這樣累加上去.讓變的越來越卡頓.
使 CADisplayLink時,它的定時器 法就是屏幕每次刷新的時候就會調 (通常屏幕 秒 鐘刷新60次) 它和setNeedsDisplay調 DrawRect 法的時機正好吻合,不會出間等待間隔.不會出現(xiàn) 屏幕卡頓現(xiàn)象.
2.2如何使 CADisplayLink添加定時器?
Target:哪個對象要監(jiān)聽 法.
selector:監(jiān)聽的 法名稱.
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)]; 想要讓CADisplayLink 作,必須得要把它添加到主運 循環(huán). 只要添加到主運 循環(huán), 跟模式沒有關系
[link addToRunLoop:[NSRunLoop mainRunLoop]
forMode:NSDefaultRunLoopMode];
2.NSAttributedString描述
字符屬性
字符屬性可以應用于 attributed string 的文本中水由。
NSString *const NSFontAttributeName;(字體)
NSString *const NSParagraphStyleAttributeName;(段落)
NSString *const NSForegroundColorAttributeName;(字體顏色)
NSString *const NSBackgroundColorAttributeName;(字體背景色)
NSString *const NSLigatureAttributeName;(連字符)
NSString *const NSKernAttributeName;(字間距)
NSString *const NSStrikethroughStyleAttributeName;(刪除線)
NSString *const NSUnderlineStyleAttributeName;(下劃線)
NSString *const NSStrokeColorAttributeName;(邊線顏色)
NSString *const NSStrokeWidthAttributeName;(邊線寬度)
NSString *const NSShadowAttributeName;(陰影)(橫豎排版)
NSString *const NSVerticalGlyphFormAttributeName;
常量
1> NSFontAttributeName(字體)
該屬性所對應的值是一個 UIFont 對象扬绪。該屬性用于改變一段文本的字體竖独。如果不指定該屬性,則默認為12-point Helvetica(Neue)挤牛。
2> NSParagraphStyleAttributeName(段落)
該屬性所對應的值是一個 NSParagraphStyle 對象莹痢。該屬性在一段文本上應用多個屬性。如果不指定該屬性墓赴,則默認為 NSParagraphStyle 的defaultParagraphStyle 方法返回的默認段落屬性竞膳。
3> NSForegroundColorAttributeName(字體顏色)
該屬性所對應的值是一個 UIColor 對象。該屬性用于指定一段文本的字體顏色竣蹦。如果不指定該屬性顶猜,則默認為黑色。
4> NSBackgroundColorAttributeName(字體背景色)
該屬性所對應的值是一個 UIColor 對象痘括。該屬性用于指定一段文本的背景顏色。如果不指定該屬性,則默認無背景色纲菌。
5> NSLigatureAttributeName(連字符)
該屬性所對應的值是一個 NSNumber 對象(整數(shù))挠日。連體字符是指某些連在一起的字符,它們采用單個的圖元符號翰舌。0 表示沒有連體字符嚣潜。1 表示使用默認的連體字符。2表示使用所有連體符號椅贱。默認值為 1(注意懂算,iOS 不支持值為 2)。
6> NSKernAttributeName(字間距)
該屬性所對應的值是一個 NSNumber 對象(整數(shù))庇麦。字母緊排指定了用于調整字距的像素點數(shù)计技。字母緊排的效果依賴于字體。值為 0 表示不使用字母緊排山橄。默認值為0垮媒。
7> NSStrikethroughStyleAttributeName(刪除線)
該屬性所對應的值是一個 NSNumber 對象(整數(shù))。該值指定是否在文字上加上刪除線航棱,該值參考“Underline Style Attributes”睡雇。默認值是NSUnderlineStyleNone。
8> NSUnderlineStyleAttributeName(下劃線)
該屬性所對應的值是一個 NSNumber 對象(整數(shù))饮醇。該值指定是否在文字上加上下劃線它抱,該值參考“Underline Style Attributes”。默認值是NSUnderlineStyleNone朴艰。
9> NSStrokeColorAttributeName(邊線顏色)
該屬性所對應的值是一個 UIColor 對象抗愁。如果該屬性不指定(默認),則等同于 NSForegroundColorAttributeName呵晚。否則蜘腌,指定為刪除線或下劃線顏色。更多細節(jié)見“Drawing attributedstrings that are both filled and stroked”饵隙。
10> NSStrokeWidthAttributeName(邊線寬度)
該屬性所對應的值是一個 NSNumber 對象(小數(shù))撮珠。該值改變描邊寬度(相對于字體size 的百分比)。默認為 0金矛,即不改變芯急。正數(shù)只改變描邊寬度。負數(shù)同時改變文字的描邊和填充寬度驶俊。例如娶耍,對于常見的空心字,這個值通常為3.0饼酿。
11> NSShadowAttributeName(陰影)
該屬性所對應的值是一個 NSShadow 對象榕酒。默認為 nil胚膊。
12> NSVerticalGlyphFormAttributeName(橫豎排版)
該屬性所對應的值是一個 NSNumber 對象(整數(shù))。0 表示橫排文本想鹰。1 表示豎排文本紊婉。在 iOS 中,總是使用橫排文本辑舷,0 以外的值都未定義喻犁。
第八課
1.CALayer的基本操作
- 設置陰影
- 默認圖層是有陰影的, 只不過,是透明的
_RedView.layer.shadowOpacity = 1;
- 默認圖層是有陰影的, 只不過,是透明的
- 設置圖片的圓角半徑
_imageView.layer.cornerRadius = 50;
裁剪,超出裁剪區(qū)域的部分全部裁剪掉
_imageView.layer.masksToBounds = YES;
注意:UIImageView當中Image并不是直接添加在層上面的.這是添加在layer當中的contents里.
我們設置層的所有屬性它只作用在層上面.對contents里面的東西并不起作用.所以我們看不到圖片有圓角的效果.
想要讓圖片有圓角的效果.可以把masksToBounds這個屬性設為YES,
當設為YES,把就會把超過根層以外的東西都給裁剪掉.
- layer的 CATransform3D屬性.
只有旋轉的時候才可以看出3D的效果.
旋轉
x,y,z 分別代表x,y,z軸.
CATransform3DMakeRotation(M_PI, 1, 0, 0);
平移
CATransform3DMakeTranslation(x,y,z)
縮放
CATransform3DMakeScale(x,y,z);
可以通過KVC的方式進行設置屬性.
但是CATransform3DMakeRotation它的值,是一個結構體, 所以要把結構轉成對象.
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];
[_imageView.layer setValue:value forKeyPath:@"transform.scale"];
可以通過KVC的方式進行設置屬性.
但是CATransform3DMakeRotation它的值,是一個結構體, 所以要把結構轉成對象.
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];
[_imageView.layer setValue:value forKeyPath:@"transform.scale"];
2.關于CALayer的疑惑?
為什么要使用CGImageRef、CGColorRef?
為了保證可移植性何缓,QuartzCore不能使用UIImage肢础、UIColor,只能使用CGImageRef碌廓、CGColorRef
UIView和CALayer都能夠顯示東西,該怎樣選擇?
對比CALayer传轰,UIView多了一個事件處理的功能。也就是說氓皱,CALayer不能處理用戶的觸摸事件路召,而UIView可以
如果顯示出來的東西需要跟用戶進行交互的話,用UIView波材;
如果不需要跟用戶進行交互股淡,用UIView或者CALayer都可以
CALayer的性能會高一些,因為它少了事件處理的功能廷区,更加輕量級
3.隱式動畫
如何取消隱式動畫?
首先要了解動畫底層是怎么做的.動畫的底層是包裝成一個事務來進行的.
什么是事務?
很多操作綁定在一起,當這些操作執(zhí)行完畢后,才去執(zhí)行下一個操作.
開啟事務
[CATransaction begin];
設置事務沒有動畫
[CATransaction setDisableActions:YES];
設置動畫執(zhí)行的時長
[CATransaction setAnimationDuration:2];
提交事務
[CATransaction commit];
核心動畫
1.CABasicAnimation基礎核心動畫
CABasicAnimation *anim =[CABasicAnimation animation];
設置縮放屬性
anim.keyPath = @"transform.scale";
縮放到最小
anim.toValue = @0;
設置動畫執(zhí)行的次數(shù)
anim.repeatCount = MAXFLOAT;
設置動畫執(zhí)行的時長
anim.duration = 0.25;
設置動畫自動反轉(怎么去, 怎么回)
anim.autoreverses = YES;
添加動畫
[self.heartView.layer addAnimation:anim forKey:nil];
2.圖片抖動(幀動畫)CAKeyframeAnimation
1.幀動畫介紹:
CAKeyframeAnimation它可以在多個值之間進行動畫.
設置多值之間的屬性為:
后面是一個數(shù)組,就是要設置的多個值.
anim.values = @[];
它還可以根據(jù)一個路徑做動畫.
anim.path = 自己創(chuàng)建的路徑.
2.圖片抖動思路:
其實就是做一個左右旋轉的動畫.先讓它往左邊旋轉-5,再往右邊旋轉5度,再從5度旋轉到-5度.
就會有左右搖擺的效果了.
具體實現(xiàn)代碼
創(chuàng)建幀動畫
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
設置動畫屬性為旋轉
anim.keyPath = @"transform.rotation";
設置屬性值為多個屬性
anim.values = @[@(angle2radio(-5)),@(angle2radio(5)),@(angle2radio(-5))];
設置動畫執(zhí)行次數(shù)
anim.repeatCount = MAXFLOAT;
添加動畫
[_imageView.layer addAnimation:anim forKey:nil];
3.根據(jù)圓形的路徑做移動的效果.
創(chuàng)建路徑
UIBezierPath *path = [UIBezierPath
bezierPathWithOvalInRect:CGRectMake(50, 50, 100, 100)];
[path addLineToPoint:CGPointMake(200, 500)];
把路徑設為動畫的屬性
anim.path = path.CGPath;
3.轉場動畫CATransition
09-轉場動畫
1.什么是轉場動畫?
就是從一個場景轉換到另一個場景,像導航控制器的push效果,就是一個轉場.
2.如何創(chuàng)建轉場動畫
創(chuàng)建轉場動畫
CATransition *anim = [CATransition animation];
設置轉場類型
anim.type = @"cube";
anim.duration = 1;
設置轉場的方向
anim.subtype = kCATransitionFromLeft;
設置動畫的開始位置
anim.startProgress = 0.5;
設置動畫的結束位置
anim.endProgress =0.8;
添加動畫.了
[_imageV.layer addAnimation:anim forKey:nil];
要執(zhí)行動畫的代碼稱為轉場代碼.
轉場動畫要和轉場代碼寫在同一個方法當中才有動畫效果.
3.UIView進行轉場動畫
[UIView transitionWithView:self.imageV duration:1
options:UIViewAnimationOptionTransitionFlipFromRight
animations:^{
轉場代碼
} completion:^(BOOL finished) {
動畫執(zhí)行完畢時調用.
}];
使用UIView轉場的類型比較少.
4.動畫組CAAnimationGroup
可以同時執(zhí)行多個動畫.
創(chuàng)建組動畫
CAAnimationGroup *group = [CAAnimationGroup animation];
平移
CABasicAnimation *anim = [CABasicAnimation animation];
anim.keyPath = @"position.y";
anim.toValue = @400;
縮放
CABasicAnimation *scaleAnim = [CABasicAnimation animation];
scaleAnim.keyPath = @"transform.scale";
scaleAnim.toValue = @0.5;
設置動畫組屬性
group.animations = @[anim,scaleAnim];
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
添加組動畫
[self.redView.layer addAnimation:group forKey:nil];
使用動畫組的好處,不需要每次都去添加動畫,設置動畫完成時的屬性.
只需要把要執(zhí)行的動畫,添加到動畫組的animations數(shù)組當中即可,
最后把組動畫添加到層上面,就會自動執(zhí)行數(shù)組當中的動畫.
動畫完成時設置的屬性也只需要設置一次.
5.UIView與核心動畫對比?
1.UIView和核心動畫區(qū)別?
核心動畫只能添加到CALayer
核心動畫一切都是假象唯灵,并不會改變真實的值。
2.什么時候使用UIView的動畫?
如果需要與用戶交互就使用UIView的動畫.
不需要與用戶交互可以使用核心動畫
3.什么場景使用核心動畫最多?
在轉場動畫中隙轻,核心動畫的類型比較多
根據(jù)一個路徑做動畫埠帕,只能用核心動畫(幀動畫)
動畫組:同時做多個動畫