iOS開發(fā)之你可能未留意的細(xì)節(jié)(持續(xù)更新)

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é)你是否留意到了?

直接上圖

example.gif

這種相冊(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è)贊吧??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市憎蛤,隨后出現(xiàn)的幾起案子外傅,更是在濱河造成了極大的恐慌,老刑警劉巖俩檬,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萎胰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡棚辽,警方通過查閱死者的電腦和手機(jī)技竟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屈藐,“玉大人榔组,你說我怎么就攤上這事×撸” “怎么了搓扯?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)包归。 經(jīng)常有香客問我锨推,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任换可,我火速辦了婚禮椎椰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沾鳄。我一直安慰自己慨飘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布译荞。 她就那樣靜靜地躺著瓤的,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磁椒。 梳的紋絲不亂的頭發(fā)上堤瘤,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天玫芦,我揣著相機(jī)與錄音浆熔,去河邊找鬼。 笑死桥帆,一個(gè)胖子當(dāng)著我的面吹牛医增,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播老虫,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叶骨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了祈匙?” 一聲冷哼從身側(cè)響起忽刽,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夺欲,沒想到半個(gè)月后跪帝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡些阅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年伞剑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片市埋。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黎泣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缤谎,到底是詐尸還是另有隱情抒倚,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布坷澡,位于F島的核電站托呕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镣陕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一谴餐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呆抑,春花似錦岂嗓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侈咕,卻和暖如春公罕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耀销。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工楼眷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熊尉。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓罐柳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親狰住。 傳聞我的和親對(duì)象是個(gè)殘疾皇子张吉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容