「 iOS知識小集 」2018 · 第 40 期
在過去的一週,Google 在 Flutter Live 2018 上正式釋出了 Flutter 1.0。這也意味 Flutter 步入正軌,我們可以更多地去嘗試這門技術。關於 Flutter 1.0 更多的資訊,可以檢視 Flutter 1.0 正式版: Google 的便攜 UI 工具包。
上週公眾號釋出的以下文章:
- 關於performSelector:afterDelay:的一個坑及思考
- Flutter Live 2018 Flutter 1.0 釋出
- 關於 iOS 物件的小事的探究
- Instruments 之 Energy Log
本期知識小集的主要內容包括:
- 關於 UIApplicationState 在 iOS 12.0 系統中的 Bug
- 為 UIView “截圖”
- 覆蓋父類同名屬性
關於 UIApplicationState 在 iOS 12.0 系統中的 Bug
作者: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 這四年(下)
內容都非常不錯,強烈推薦。詳情內容可檢視官方網站。
關注我們
歡迎關注我們的公眾號:iOS-Tips,也歡迎加入我們的群組討論問題。可以公眾號留言 ios
、flutter
等關鍵詞獲取入群方式。