1.正確設(shè)置Lable圓角的姿勢(shì)
需求如圖(常用作標(biāo)簽):
常規(guī)做法:
self.label.text = @"皮爾斯";
self.label.backgroundColor = [UIColor brownColor];
self.label.layer.cornerRadius = 5;
self.label.layer.borderWidth = 1;
self.label.layer.borderColor = [UIColor cyanColor].CGColor;
self.label.layer.masksToBounds = YES;
我這里用模擬器調(diào)試如圖:
標(biāo)黃的地方是告訴我們這些地方引起了離屏渲染
(更新于2019年2月27日01:03:11)
離屏渲染簡(jiǎn)單概念:GPU在當(dāng)前屏幕緩沖區(qū)之外開辟一個(gè)新的緩沖區(qū)進(jìn)行渲染操作恢总,產(chǎn)生額外開銷,可能會(huì)造成卡頓
我們知道當(dāng)FPS小于60的時(shí)候挺庞,我們?nèi)庋蹠?huì)感到卡頓
FPS即每秒刷新數(shù)喘批,即 1000 / 60 ≈ 16.7ms裁替,即16.7ms以內(nèi)刷新一次頁面就不會(huì)感到卡頓近忙,系統(tǒng)生成圖像信號(hào)是靠 CPU + GPU 共同工作的萎坷,即CPU + GPU 共同工作生成圖像需要 < 16.7ms脂崔,而如果CPU或者GPU工作壓力太大,生成圖像信號(hào)大于這個(gè)時(shí)間爪飘,那么就會(huì)放棄掉這一幀义起,而繼續(xù)顯示之前的圖像
因?yàn)殡x屏渲染會(huì)增加GPU的壓力,所以我們應(yīng)該盡量避免離屏渲染的發(fā)生
現(xiàn)在修改一下代碼
self.label.text = @"皮爾斯";
self.label.layer.backgroundColor = [UIColor brownColor].CGColor;
self.label.layer.cornerRadius = 5;
self.label.layer.borderWidth = 1;
self.label.layer.borderColor = [UIColor cyanColor].CGColor;
效果如圖:
哈哈师崎,離屏渲染沒有了默终!
精髓在于我們干掉了masksToBounds這行代碼,而顏色的設(shè)置放到了layer層
以后碰到類似需求就這樣做吧,思密達(dá)齐蔽!
2.數(shù)組之泛型數(shù)組
Person* p1 = [Person new];
Person* p2 = [Person new];
Person* p3 = [Person new];
NSArray* arr = @[p1,p2,p3];
for (int i = 0; i < arr.count; i++) {
arr[0];
}
如圖arr數(shù)組里存儲(chǔ)了3個(gè)Person實(shí)例两疚,并進(jìn)行遍歷
這樣寫固然沒有問題,但是我數(shù)組的初始化如果不是用字面量的方式肴熏,arr里元素到底存儲(chǔ)了那些東西鬼雀,我們是需要扒代碼的顷窒,有些項(xiàng)目的代碼復(fù)雜度遠(yuǎn)遠(yuǎn)超乎你的想象蛙吏,此時(shí)是非常耗時(shí)間的
OC的數(shù)組是可以存儲(chǔ)任何類型對(duì)象的,但是我強(qiáng)烈建議用泛型除非特殊需求(雖然我接過這樣的需求)
代碼改動(dòng)下:
Person* p1 = [Person new];
Person* p2 = [Person new];
Person* p3 = [Person new];
NSArray<Person*>* arr = @[p1,p2,p3];
為什么建議用泛型呢鞋吉?
1.在數(shù)組聲明的時(shí)候就已經(jīng)明確數(shù)組里元素的數(shù)據(jù)類型了
2.用enumerateObjectsUsingBlock遍歷數(shù)組時(shí)鸦做,你會(huì)發(fā)現(xiàn)數(shù)組里元素類型IDE已經(jīng)幫我們輸入好了(超贊的)而且《52高效》的書推薦我們用這種方式遍歷數(shù)組
3. ARC下如何打印retainCount(引用計(jì)數(shù))
// obj目標(biāo)對(duì)象
NSInteger retainCount = CFGetRetainCount((__bridge CFTypeRef)chen);
NSLog(@"Retain count is %ld", retainCount);
4.category你是否這么用過?
之前在某項(xiàng)目看到這樣的分類:
@interface NSString (Help)
- (BOOL)isEmpty;
@end
@implementation NSString (Help)
- (BOOL)isEmpty {
if (self == nil) {
return YES;
}
return NO;
}
@end
一個(gè)判斷字符串是否為空的分類谓着,按照代碼邏輯當(dāng)字符串對(duì)象為nil的時(shí)候泼诱,認(rèn)為為空返回true
但是卻犯了一個(gè)大問題:當(dāng)字符串對(duì)象為nil的時(shí)候,isEmpty方法是永遠(yuǎn)不會(huì)執(zhí)行的赊锚,邏輯上表現(xiàn)為一個(gè)為nil的字符串對(duì)象他不認(rèn)為是空的治筒,返回false(這樣做邏輯不就中獎(jiǎng)了么?)
為什么會(huì)這樣呢舷蒲?
當(dāng)字符串對(duì)象為nil的時(shí)候即[nil isEmpty]耸袜,我們向nil對(duì)象發(fā)送了一條消息,OC的機(jī)制向nil發(fā)送消息是允許的牲平,但是方法永遠(yuǎn)不會(huì)執(zhí)行堤框,這樣做邏輯你說會(huì)不會(huì)中獎(jiǎng)?
5.將view 放到的圖層最上端
// 目標(biāo)view假設(shè)為topView
// 1
[self.view insertSubview:topView atIndex:[self.view subviews].count];
// 2
[[topView superview] bringSubviewToFront:topView];
6.UI妹子眼中一根線的粗細(xì)到底是多少纵柿?
#define SINGLE_LINE_HEIGHT (1 / [UIScreen mainScreen].scale)
為什么要這樣呢:
scale的官方解釋:
中文:
與屏幕相關(guān)的自然比例因子蜈抓。
此值反映從默認(rèn)邏輯坐標(biāo)空間轉(zhuǎn)換到此屏幕的設(shè)備坐標(biāo)空間所需的縮放因子。 使用點(diǎn)測(cè)量默認(rèn)邏輯坐標(biāo)空間昂儒。 對(duì)于標(biāo)準(zhǔn)分辨率顯示器沟使,比例因子為1.0,一點(diǎn)等于一個(gè)像素渊跋。 對(duì)于Retina顯示器腊嗡,比例因子為2.0,一個(gè)點(diǎn)由四個(gè)像素表示刹枉。
7.這個(gè)細(xì)節(jié)你是否留意到了叽唱?
直接上圖(以某大廠出的app舉例)
這種控件現(xiàn)在越來越多的項(xiàng)目在用,但是呢微宝,這個(gè)細(xì)膩的地方在于:
滑到“全部”這個(gè)頁面的時(shí)候棺亭,再次右滑是可以pop的,雖說看起來一樣的控件蟋软,但是我發(fā)現(xiàn)很多app是沒有處理這個(gè)滑動(dòng)pop邏輯的
我們自己的項(xiàng)目中也大面積使用了這種方式镶摘,當(dāng)然這種細(xì)膩的體驗(yàn)我當(dāng)然是要加進(jìn)來的(o)/
直接上代碼(如果有更好的思路希望提出來嗽桩,共同學(xué)習(xí)哈!)
假設(shè)如圖例子的UI結(jié)構(gòu)是:ScrollView里添加了5個(gè)子View
// 給VC的view添加pan手勢(shì)
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] init];
panGesture.delegate = self;
[self.view addGestureRecognizer:panGesture];
// 實(shí)現(xiàn)此代理
// 詢問一個(gè)手勢(shì)接收者是否應(yīng)該開始解釋執(zhí)行一個(gè)觸摸接收事件
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 這個(gè)_pageIndex就是記錄當(dāng)前滑到了哪個(gè)title下
// 比如說在這里_pageIndex == 0 就是“全部”這個(gè)title下的頁面
if (_pageIndex == 0) {
CGPoint translatedPoint = [(UIPanGestureRecognizer *)gestureRecognizer translationInView:self.view];
NSLog(@"%f %f",translatedPoint.x,translatedPoint.y);
// 當(dāng)在“全部”title下凄敢,且右滑的情況下碌冶,禁止scrollView滾動(dòng)
self.scrollView.scrollEnabled = translatedPoint.x < 0;
}
return NO;
}
8.這個(gè)細(xì)節(jié)你是否留意到了?
直接上圖
這種相冊(cè)預(yù)覽相信大家已經(jīng)見過太多了涝缝,但是請(qǐng)注意個(gè)小細(xì)節(jié)扑庞,圖片是由模糊漸漸變清晰的(微信圖片瀏覽器就有這個(gè)細(xì)節(jié))
這么做好處在哪里呢?
I/O操作是比較號(hào)資源的拒逮,我們先拿小圖即縮略圖展示出來罐氨,提高展示效率,其次獲取高清圖之后再替換滩援,既提高了效率又加強(qiáng)了交互體驗(yàn)栅隐,一箭雙雕,nice玩徊。
如果有更好的實(shí)現(xiàn)方式租悄,請(qǐng)留言或者聯(lián)系我
代碼的實(shí)現(xiàn)方式請(qǐng)參考我的dolin_demo
以前碰到的都忘記總結(jié)了,就想起了這些恩袱,不過后續(xù)會(huì)持續(xù)更新
如果給你帶來了一點(diǎn)點(diǎn)幫助泣棋,就點(diǎn)個(gè)贊吧??