「 iOS知識小集 」2018 · 第 40 期
作者:ibabyblue_z
UIApplicationState 分為三種狀態:
- UIApplicationStateActive:App處於活躍狀態(在前臺並正在接收事件)
- UIApplicationStateInactive:App處於非活躍狀態(在前臺並未接收事件/正在前臺進入後臺、後臺進入前臺時)
- UIApplicationStateBackground:App處於後臺狀態
專案有個需求,當 App 在後臺時,接收到訊息需要彈本地通知。突然線上反饋說功能失效了,並且還是個別用戶。經驗證這是iOS12.0系統的 Bug,已經在 iOS 12.1 中修復了!
之前的邏輯是判斷 App 是否在後臺,使用了 UIApplicationStateBackground,但是在 iOS 12.0中,當 App 在後臺時,獲取系統狀態返回為 UIApplicationStateInactive。
為 UIView “截圖”
作者:halohily
想為某個 UIView 的內容生成一張圖片,系統提供了非常方便的解決方式:使用 CoreGraphics
UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0); //獲取當前上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); //渲染 [view.layer renderInContext:ctx]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; 複製程式碼
若要為 UIView 生成 UIView 形式的快照,可以使用 UIView 的例項方法簇:
- (nullable UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0); 複製程式碼
覆蓋父類同名屬性
作者:Vong_HUST
日常開發中,我們都可能會碰到這種情況,繼承系統的某個類,但是想要覆蓋父類的某個屬性名(大部分情況是delegate
、dataSource
)會發現兩個煩人的warning
,程式碼如下所示。
@protocol VVLTextViewDelegate; @interface VVLTextView : UITextView // warning1: Property type 'id<VVLTextViewDelegate>' is incompatible with type 'id<UITextViewDelegate> _Nullable' inherited from 'UITextView' // warning2: Auto property synthesis will not synthesize property 'delegate'; it will be implemented by its superclass, use @dynamic to acknowledge intention @property (nonatomic, weak) id<VVLTextViewDelegate> delegate; @end @protocol VVLTextViewDelegate <UITextViewDelegate> - (void)test; @end @implementation VVLTextView @end 複製程式碼
這個時候除了重新命名delegate
之外,還有沒有其它操作能夠消除警告而且能正常使用呢?答案是肯定的。
根據警告,我們可以把delegate
在 .m 裡宣告為dynamic
的,然後再把protocol
的定義放到類定義之前,即可實現,程式碼如下。
@protocol VVLTextViewDelegate <UITextViewDelegate> - (void)test; @end @interface VVLTextView : UITextView @property (nonatomic, weak) id<VVLTextViewDelegate> delegate; @end @implementation VVLTextView @dynamic delegate; @end 複製程式碼
像系統自帶的一些類(比如UICollectionView/UITableView
)應該也是用類似方式來實現的吧,我猜。現在也終於想明白為什麼系統的大部分協議定義都放在類之前了,應該跟這個有點關係。所以以後有類似需求,可以不需要再去重寫一個屬性名,然後複寫其setter
方法來賦值了。
特別推薦
SwiftGG 團隊自 10.29 推出第一期 ggtalk 以來,已連續推出 7 期的內容。這是一個接地氣、有價值的閒聊節目。一幫程式員,在無盡的接需求寫程式碼改 bug 加班上線迴圈中開闢出來的一塊空地,想想過去,聊聊現在,偶爾也展望一下未來。
7 期的內容清單如下:
- 聊聊程式設計師的升職加薪(上)
- 我都花時間搭部落格了,為什麼還要花時間寫?
- 和裕波聊聊如何辦一場技術大會(上)
- 和裕波聊聊如何辦一場技術大會(下)
- 聊聊程式設計師的升職加薪(下)
- 聊聊 Swift 這四年(上)
- 聊聊 Swift 這四年(下)
內容都非常不錯,強烈推薦。詳情內容可檢視官方網站。