第三方庫之 - SVProgressHUD

1. 發現兩個問題

說是兩個問題, 但我不知道算不算是問題, 至少我感受這影響到了用戶體驗.app

1.1 問題1

我測試時候發現, 當界面正在展現進度條, 這時候彈出了鍵盤, 進度展現控件會自動上移一段距離, 鍵盤隱藏, 進度展現會恢復到原來的位置. 可是, 在鍵盤顯示, 進度圈上移以後, 應用程序進入後臺, 再回到前臺時候, 進度展現圈的位置在上移以前的位置. 以下所示:ide

分析測試

固然, 想固然的分析確定是不行的, 必須去閱讀相關的代碼才能找到問題所在. 經過查閱源碼發現, sv中全部的更改位置的代碼都是經過positionHUD:這個方法來實現了, 在彈出鍵盤隱藏鍵盤, 應用成爲活躍狀態等等的通知都走這個方法. 這個方法比較長, 由於做者考慮到了各類應用場景, 各類可能會出現的狀況. 此方法的功能實現思路大概是: 算出鍵盤的高度, 根據鍵盤高度算出HUD位置, 最後重置HUD位置.code

出現如上提出的問題, 確定是在應用從後臺進入前臺時候鍵盤高度沒有計算好, 在源碼的 Get keyboardHeight in regards to current state 這塊代碼中, 做者並無對從後臺進入前臺時候進行特殊處理, 讀取的仍是鍵盤隱藏或者顯示出來時候的通知, 如圖: QQ20160527-0.png 爲了解決這個問題, 個人處理方法就是對從後臺進入前臺時候進行特殊處理, 主動獲取鍵盤的高度, 並計算出HUD的位置. 如圖: QQ20160527-1.png 這樣處理以後, 能夠完美解決上述問題1. 若是誰有更好的方法或者其餘觀點, 歡迎留言 !orm

1.2 問題2

問題2是在測試問題1時候新發現的問題. 問題是這樣的, 先彈出鍵盤, 再用代碼彈出一個進度提示, 與, 先彈出進度提示, 而後彈出鍵盤, sv的位置不一樣, 第一種方式比第二種方式高了一點(模擬機上沒有這個問題, 真機iOS9.2系統會出現這樣的問題). 如圖所示:圖片

測試發現, 出現這個問題是由於, 經過以下圖所示兩種方法獲取到的鍵盤高度不一致! 同一個鍵盤, 相同的狀態, 我測試時候高度差了40, 不知道是什麼緣由. 測試發現, 鍵盤高度取值若是是 UIKeyboardFrameEndUserInfoKey , 那麼兩個方法獲取鍵盤高度就一致了. 就這樣, 問題解決了. 其實用代碼解決問題仍是很簡單的, 只是修改了兩句源碼, 可是分析問題, 發現並去解決問題這個過程卻並非這麼容易. 若是誰有更好的方法或者其餘觀點, 歡迎留言.ip

QQ20160527-2.png

2. 閱讀筆記

2.1 懶加載建立view

簡單的懶加載卻是沒什麼好說的, 可是當去造一個輪子時候, 且輪子的樣式有不少種, 而且可能隨時放生變化時候, 這時候使用以下所示的方法仍是比較好的. 之前有本身造一個擁有不少屬性可能會變化的輪子, 個人處理方法是, 在須要用到屬性的位置去獲取, 今天看到這個方法感受仍是懶加載這種方法比較好, 懶加載建立, 其餘屬性每次須要時候都動態的去獲取.element

- (SVProgressAnimatedView*)ringView {
    if(!_ringView) {
        _ringView = [[SVProgressAnimatedView alloc] initWithFrame:CGRectZero];
    }
    
    // Update styling
    _ringView.strokeColor = self.foregroundColorForStyle;
    _ringView.strokeThickness = self.ringThickness;
    _ringView.radius = self.statusLabel.text ? self.ringRadius : self.ringNoTextRadius;
    
    return _ringView;
}

2.2 圖片渲染模式

typedef NS_ENUM(NSInteger, UIImageRenderingMode) {
    UIImageRenderingModeAutomatic,          // Use the default rendering mode for the context where the image is used
    
    UIImageRenderingModeAlwaysOriginal,     // Always draw the original image, without treating it as a template
    UIImageRenderingModeAlwaysTemplate,     // Always draw the image as a template image, ignoring its color information
} NS_ENUM_AVAILABLE_IOS(7_0);

2.3 accessibility屬性

事實上, 尚未搞懂這東西怎麼用.....源碼

// Accessibility support
self.accessibilityIdentifier = @"SVProgressHUD";
self.accessibilityLabel = @"SVProgressHUD";
self.isAccessibilityElement = YES;

An identifier can be used to uniquely identify an element in the scripts you write using the UI Automation interfaces. Using an identifier allows you to avoid inappropriately setting or accessing an element’s accessibility label.it

3. 後記

這個庫在代碼學到了一些 , 在程序總體結構上, 沒什麼東西, 總之仍是有收穫的.

相關文章
相關標籤/搜索