1. 程式人生 > >「 iOS知識小集 」2018 · 第 40 期

「 iOS知識小集 」2018 · 第 40 期

原文連結

在過去的一週,Google 在 Flutter Live 2018 上正式釋出了 Flutter 1.0。這也意味 Flutter 步入正軌,我們可以更多地去嘗試這門技術。關於 Flutter 1.0 更多的資訊,可以檢視 Flutter 1.0 正式版: Google 的便攜 UI 工具包

上週公眾號釋出的以下文章:

本期知識小集的主要內容包括:

  • 關於 UIApplicationState 在 iOS 12.0 系統中的 Bug
  • 為 UIView “截圖”
  • 覆蓋父類同名屬性

關於 UIApplicationState 在 iOS 12.0 系統中的 Bug

作者:ibabyblue_z

UIApplicationState 分為三種狀態:

  1. UIApplicationStateActive:App處於活躍狀態(在前臺並正在接收事件)
  2. UIApplicationStateInactive:App處於非活躍狀態(在前臺並未接收事件/正在前臺進入後臺、後臺進入前臺時)
  3. 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

日常開發中,我們都可能會碰到這種情況,繼承系統的某個類,但是想要覆蓋父類的某個屬性名(大部分情況是 delegatedataSource)會發現兩個煩人的 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,也歡迎加入我們的群組討論問題。可以公眾號留言 iosflutter 等關鍵詞獲取入群方式。