精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

干凈優雅的做iOS應用內全局交互屏蔽

移動開發 iOS
值得注意的是,這一類事件包括但不限于用戶觸摸事件,還有屏幕重力感應的變化等非用戶輸入事件,這就意味著這一類問題如果要優雅解決的話,不能單靠添加一個"觸摸屏蔽層"。

01、交互屏蔽的需求

很多應用開發者都會遇到這樣一個需求,當程序需要處理某個敏感的核心任務,或者執行某些動畫時,需要杜絕一切外部干擾,優先保證任務的完成,之后再去處理其它任務。否則如果在處理過程中受到外部事件的干擾,可能會引入嚴重的問題,而規避這些問題需要額外編寫過多的邏輯。

例如,當程序在忙著清理應用內緩存的過程中去處理其它任務,這時候由于其它任務可能會產生新的緩存,這就會和現有的任務沖突。所以在清理緩存的過程中,app 一般會暫時中斷用戶和非用戶的請求,優先保證緩存清理的完成。

所以,為了簡化產品設計邏輯,開發者一般會選擇在處理任務時暫時屏蔽其它任務,優先保障現有任務的完成。

舉例來說,當用戶點擊清理緩存時,應用程序可能會彈出一個帶有進度條的清理界面,在該界面下,清理工作緊張的進行著,并且告知用戶正在清理任務,請稍候。

另一個需求是和動畫有關,有時候我們在應用內可能會執行一些小動畫,例如按鈕的淡入淡出,整個頁面的切換等。這些動畫可能不會因為用戶做快速的操作導致程序崩潰,但是因為每個動畫都要時間完成,如果用戶快速亂點的話,有可能會出現意想不到的情況。

例如,假設用戶點擊某個開關切換按鈕,開關狀態為開時,屏幕側邊以動畫形式彈出側邊欄,當開關狀態為關時,屏幕側邊欄以動畫形式消失。那么如果用戶快速反復點擊按鈕,而開發者沒有處理好開關切換間隙的邏輯的話,那么就會出現側邊欄彈出動畫還沒執行完,就立刻消失的情況。

值得注意的是,這一類事件包括但不限于用戶觸摸事件,還有屏幕重力感應的變化等非用戶輸入事件,這就意味著這一類問題如果要優雅解決的話,不能單靠添加一個"觸摸屏蔽層"。

02、常見的解決辦法

對于以上問題,開發者選擇的解決辦法主要是兩種:

第一個辦法,設計一個布爾變量記錄當前是否正在執行任務(或處理動畫),處理這個過程中的交互邏輯。

這個辦法本身沒什么問題,但是開發者不得不針對每個任務去編寫對應的邏輯,這樣寫起來就特別容易散亂。

第二個辦法,設置 UIView 或者控件的 userInteractionEnabled 為 false,并在合適的時機重新變為 true 。

這樣做有個好處是,將整個 UIView 設置不可交互后,用戶點擊其它按鈕也不會造成影響,但同時,如果對每個 UIView 去處理類似的邏輯,一不小心很容易出現 bug,最后導致整個 UIView 都卡住無法點擊。

另外,應用可能存在多個 UIView,你鎖住了一個 UIView,其它 UIView 的點擊情況是否要考慮呢?

有些開發者用了更好的辦法,他們直接用 UIViewController 的 UIView 來做 userInteractionEnabled 的處理,這樣的解決方案更進步了,但是同樣存在多個 UIViewController 這個問題,雖然有效,但還欠缺優雅。

另一方面,如上述的所有方法,僅僅能攔截"觸摸事件",而不能攔截非觸摸事件,例如加速器,攝像頭事件等,如果代碼針對這些事件會做出響應,而開發者不希望在任務期間去響應他們,將被迫去添加邏輯來屏蔽才行。

03、重新理解 UIApplication

我們對 UIApplication 不陌生了,我們經常需要通過調用UIApplication.sharedApplication。

在 iOS 的應用層 API 中,UIKit 最頂層的交互機制是通過 UIApplication 的 方法下發的 sendEvent :

- (void)sendEvent: (UIEvent*)event

UIEvent 不止包括觸摸事件,它還支持例如加速度事件等別的事件類型。

// UIEvent 的事件類型
typedef NS_ENUM(NSInteger, UIEventType) {
    UIEventTypeTouches,
    UIEventTypeMotion,
    UIEventTypeRemoteControl,
    UIEventTypePresses,
    UIEventTypeScroll,
    UIEventTypeHover,
    UIEventTypeTransform,
};

以上是 UIApplication 中的事件類型,其中最值得關注的是 UIEventTypeTouches 和 UIEventTypeMotion,因為這是開發者最常用于響應輸入的事件。

04、如何攔截 sendEvent,先搞懂 UIApplicationMain

要攔截 sendEvent,就要了解 UIApplicationMain,幾乎每個 iOS 開發者都會碰到它,因為它就在 main 函數里:

int main(int argc, char * argv[]) {
    NSString* appDelegateClassName;
    @autoreleasepool {
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
    }
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}

UIApplicationMain 相當于 iOS 應用自己的 main 函數,它的參數有 4 個,分別為 argc, argv,principalClassName 和 delegateClassName 。

其中前兩個參數就是 C 語言 main 函數的參數,appDelegateClassName 傳入的是 AppDelegate 的類名,第三個參數則傳入用戶自定義的 UIApplication 子類。

我們定義一個繼承自 UIApplication 的 MyApplication 類后,main 函數就可以傳入 MyApplication 類了。

int main(int argc, char * argv[]) {
    NSString* appDelegateClassName;
    NSString* applicationClassName;
    @autoreleasepool {
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
        applicationClassName = NSStringFromClass([MyApplication class]);
    }
    return UIApplicationMain(argc, argv, applicationClassName, appDelegateClassName);
}

還有一個方法可以不通過修改 main 函數來指定 MyApplication,在 XCode 的 Info.plist 中,新建字符串鍵 “Principal class”,其值填入子類名,即本例的 MyApplication,那么當 main 函數傳入的參數是 nil 時,Info.plist 所注冊的 “Principal class” 將會作為指定類。如果全部沒有指定,則默認為 UIApplication 。

05、sendEvent 攔截實現

在 MyApplication 類的實現部分,我們可以開始繼承 sendEvent :

- (void)sendEvent: (UIEvent*)event {
    [super sendEvent: event];
}

當應用產生了 UIEvent 事件時,系統會調用 sendEvent,此時因為我們注冊了 MyApplication,所以調用的是我們定義的 sendEvent 方法。在上個例子里,sendEvent 直接調用了父類的 sendEvent,相當于對所有事件都采取了默認處理。

接下來,如果我們打算屏蔽所有的加速器事件,那么可以這么寫:

- (void)sendEvent: (UIEvent*)event {
    if (event.type == UIEventTypeMotion) {
        NSLog(@"UIEventTypeMotion");
        return;
    }
    [super sendEvent: event];
}

這樣,如果應用內有處理搖一搖的功能,以上方法可以保證搖一搖事件不會下發。

06、交互屏蔽的接口設計

顯然,我們需要更彈性的處理 sendEvent,直接屏蔽的辦法是“一刀切”,更恰當的做法是需要屏蔽的時候才讓它屏蔽。因此,我們可以為 MyApplication 設計一個布爾屬性 eventdisabled:

@interface MyApplication()
@property (nonatomic) BOOL eventDisabled;
@end

該屬性默認值是 false,即允許所有 event ,這樣,sendEvent 方法的實現更改如下:

- (void)sendEvent: (UIEvent*)event {
    if (self.eventDisabled && (event.type == UIEventTypeTouches || event.type == UIEventTypeMotion)) {
        return;
    }
    
    [super sendEvent: event];
}

當 eventdisabled 為真時,app 在全局范圍內禁用了用戶的觸摸和加速器輸入事件,只有當 eventdisabled 為假時,一切照常進行。

雖然現在可以通過變量讓 app 實現交互的禁用和啟用了,但是我們可以設計的更彈性一點,做一個延時機制,保證延時過后交互可以恢復正常,不然開發者四處寫布爾值設置的代碼,一旦稍有不慎,整個界面卡住就糟了,為了程序的健壯性,可以設計如下方法:

- (void)disableUserInteraction: (NSTimeInterval)duration {
    self.userInteractionEnabled = NO;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration*NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        self.userInteractionEnabled = YES;
    });
}

然后,我們把該方法放到 UIApplication 的擴展中,在 MyApplication.h 加入:

@interface UIApplication()
- (void)disableUserInteraction: (NSTimeInterval)duration;
@end

這樣,當我們需要臨時禁用用戶輸入時,可以這么調用:

[UIApplication.sharedApplication disableUserInteraction: 0.3];

此時應用會在 0.3 秒內處于禁用狀態,并在稍后自動恢復。

07、如何進一步優化

以上介紹的屏蔽方案已經可以解決大部分日常需求,但是還有優化空間。

例如,當有多次調用 disableUserInteraction 時,例如:

[UIApplication.sharedApplication disableUserInteraction: 0.3];
[UIApplication.sharedApplication disableUserInteraction: 1.3];

我們會發現,0.3 秒后應用就恢復了交互,而 1.3 秒的屏蔽"失效"了。

 本文轉載自微信公眾號「搜狐技術產品」,可以通過以下二維碼關注。轉載本文請聯系搜狐技術產品公眾號。

責任編輯:武曉燕 來源: 搜狐技術產品
相關推薦

2021-03-04 08:19:31

警告屏蔽函數

2013-04-12 15:59:33

2021-09-22 11:05:19

JS代碼前端

2020-08-25 14:03:20

應用程序屏蔽應用程序內保護網絡攻擊

2013-06-25 09:38:13

2017-11-30 14:44:41

語言代碼文件

2013-04-12 15:53:39

2013-12-08 22:02:24

手勢交互交互設計交互體驗

2018-06-26 10:25:53

iOS應用系統

2011-11-16 15:47:04

AdobeAIRiOS應用

2011-05-13 15:10:12

屏蔽系統布線

2018-01-12 15:59:36

2021-08-27 14:36:03

JamfiOS應用權限

2017-03-20 16:30:15

Android退出應用優雅方式

2019-01-24 16:11:19

前端全局異常數據校驗

2022-05-03 10:43:43

SpringJava

2013-02-19 10:47:17

情感交互產品交互趨勢

2011-05-19 09:57:45

應用內支付App StoreiOS

2013-05-28 17:14:01

iOS開發移動應用移動開發

2021-04-20 10:50:38

Spring Boot代碼Java
點贊
收藏

51CTO技術棧公眾號

欧美人体视频| 爱看av在线| 国产精品18久久久久久久久 | 最新日本中文字幕| 国产精品一二三产区| 欧美高清在线精品一区| 97久久人人超碰caoprom欧美| 日韩av免费网址| 成人写真视频| 亚洲福利精品在线| 亚洲综合日韩欧美| av剧情在线观看| 国产精品美女久久久久久久| 福利视频一区二区三区| 久久久国产免费| 亚洲性感美女99在线| 一本色道久久88综合亚洲精品ⅰ| 麻豆tv在线观看| 精品美女一区| 岛国精品视频在线播放| 在线一区二区日韩| 中文字幕亚洲日本| h1515四虎成人| 精品人伦一区二区三区蜜桃网站 | 欧美一区二区三区久久精品茉莉花| 亚洲第一精品夜夜躁人人躁 | 久久久久久不卡| 中文字幕一区二区三区欧美日韩| 亚洲美女视频网站| 四虎国产精品永久免费观看视频| jizz久久久久久| 欧美午夜精品在线| 日本精品久久久久久久久久| 超碰在线免费公开| 中文字幕免费观看一区| 精品国产乱码久久久久久88av| 国产精品国产一区二区三区四区 | 麻豆视频在线观看免费| caoporen国产精品视频| 91入口在线观看| 一本一道人人妻人人妻αv| 亚洲专区一区| 97色伦亚洲国产| 九九精品在线观看视频| 香港欧美日韩三级黄色一级电影网站| 国产亚洲精品久久久久动| 在线免费观看a级片| 亚洲午夜精品| 精品免费日韩av| 国产ts在线观看| 8848成人影院| 欧美精品一区二区在线观看| 欧美xxxx黑人| 77成人影视| 亚洲成人激情图| 尤物网站在线观看| 精品深夜福利视频| 日韩电影视频免费| 亚洲精品女人久久久| 日韩精选在线| 亚洲视屏在线播放| 日本成人午夜影院| 99久久久国产精品免费调教网站| 欧美日韩中文字幕综合视频| wwwxxx黄色片| 香蕉成人影院| 在线不卡欧美精品一区二区三区| 亚洲 国产 图片| 国产在线一区不卡| 精品福利一二区| 国产熟女高潮一区二区三区| 欧美激情在线免费| 在线观看国产精品日韩av| 老司机深夜福利网站| 一级欧洲+日本+国产| 欧美丰满少妇xxxx| 国产成人亚洲欧洲在线| 久久婷婷丁香| 国产在线播放不卡| 亚洲精品国产精| 91一区二区在线观看| 涩涩日韩在线| av免费看在线| 亚洲va国产va欧美va观看| 国产女女做受ⅹxx高潮| 粉嫩91精品久久久久久久99蜜桃| 91精品国产91久久久久久最新毛片 | 免费高清在线观看| 亚洲黄色av一区| www.中文字幕在线| 亚洲日本中文| 高潮白浆女日韩av免费看| 免费在线观看的av网站| 国产激情欧美| 日韩精品最新网址| 国产美女免费无遮挡| 99精品国产一区二区三区| 欧美日韩国产第一页| 日韩影视一区二区三区| 中文不卡在线| 欧美在线免费看| 91欧美日韩麻豆精品| 成人免费毛片片v| 日韩久久久久久久| 男人天堂亚洲天堂| 欧美日韩国产一区二区三区地区| 人妻精油按摩bd高清中文字幕| 日韩精选在线| 欧美成在线观看| 亚洲色成人www永久网站| 国产精品1区2区| 亚洲精品日韩成人| 英国三级经典在线观看| 亚洲韩国一区二区三区| 黑人粗进入欧美aaaaa| 99精品国产一区二区三区2021| 亚洲一区999| 国产精品a成v人在线播放| 免费成人你懂的| 精品国产_亚洲人成在线| 伊人电影在线观看| 欧美日韩免费一区二区三区| 亚洲av片不卡无码久久| 韩国欧美一区| 91亚洲精品久久久久久久久久久久| 日韩三级电影网| 亚洲国产日韩一区二区| 欧美精品 - 色网| 国产在线日韩精品| 8090成年在线看片午夜| www.黄色片| 成人免费在线播放视频| 午夜久久久精品| 深夜福利久久| 青青精品视频播放| 亚洲av成人精品毛片| 亚洲国产视频一区二区| 国产精欧美一区二区三区白种人| 国产麻豆精品久久| 国产98色在线| 精品视频一二三| 日韩欧亚中文在线| 女尊高h男高潮呻吟| 亚洲激情网址| 国产一区二区精品免费| 国产精品蜜芽在线观看| 亚洲国产高清自拍| 99精品视频99| 99久久婷婷国产综合精品电影| 国产视频在线观看网站| 亚洲成人五区| 久久久久久国产精品| 成人毛片在线精品国产| 亚洲一区二区三区在线看 | 丁香亚洲综合激情啪啪综合| 91免费版看片| 91精品国产自产在线丝袜啪| 久久久久久久久久亚洲| 亚洲精品久久久久久无码色欲四季| 亚洲欧美国产三级| 日本中文字幕精品| 99国产精品| 欧美日韩国产综合视频在线| 国产日韩电影| 日韩在线视频国产| 99国产精品一区二区三区| 亚洲欧美一区二区三区国产精品| 爱情岛论坛亚洲自拍| 激情综合中文娱乐网| 精品久久一区二区三区蜜桃| 日本黄色免费在线| 一区二区三区视频免费| 亚洲天堂免费av| 亚洲激情综合网| 亚洲蜜桃精久久久久久久久久久久| 噜噜噜在线观看免费视频日韩| 色综合久久久久久久久五月| 久久综合给合| 91精品国产91久久久久福利| 国产高清免费在线播放| 在线不卡a资源高清| 国产精品30p| 国产精品天干天干在观线| 91在线第一页| 夜夜嗨一区二区三区| 日韩av不卡播放| 精品国产麻豆| 欧美在线www| 黄av在线播放| 亚洲国产毛片完整版| 最新黄色网址在线观看| 成人免费高清在线| 日韩 欧美 高清| 中文字幕免费精品| 日本精品一区二区三区视频| 999久久久国产999久久久| 96精品视频在线| 免费黄色电影在线观看| 日韩av影院在线观看| 国产欧美久久久精品免费| 精品久久久久久久久久久久久久 | 欧美日韩中文字幕| 亚洲精品电影院| 99riav一区二区三区| 天天干天天色天天干| 亚洲综合另类| 九一免费在线观看| 精品国产一区二区三区噜噜噜| 91成人在线看| 国产精品第一| 9.1国产丝袜在线观看| а天堂中文在线官网| 国产一区二区三区久久精品| 亚洲精品一区二区三区四区| 欧美日韩高清一区| 亚洲精品男人的天堂| 亚洲一区二区三区中文字幕| 日本黄区免费视频观看| 91麻豆国产自产在线观看| 超级砰砰砰97免费观看最新一期| 日本成人中文字幕| aa免费在线观看| 亚洲激情女人| 真人抽搐一进一出视频| 亚洲一区二区三区无吗| 亚洲黄色一区二区三区| 伊人春色之综合网| 久久精品国产99精品国产亚洲性色| 国产亚洲高清在线观看| 国产欧美一区二区三区视频| 亚洲精品在线影院| 国产97在线观看| 欧美xxx网站| 欧美性受xxx| 国产调教在线| 97国产在线观看| 2020国产在线| 久久久综合免费视频| 日本动漫同人动漫在线观看| 久久国产精品久久久久久久久久| 成a人v在线播放| 国产亚洲精品美女| 成人在线免费观看| 一区二区三区视频观看| yw193.com尤物在线| 国产一区二区三区欧美| 高清在线观看av| 一本一本久久a久久精品综合小说| 日本护士...精品国| 亚洲欧美在线磁力| 精品影院一区| 日韩综合视频在线观看| 午夜视频在线看| 波霸ol色综合久久| 国产原创在线观看| 九九精品视频在线观看| 午夜影院免费在线| 欧美激情啊啊啊| 黄在线观看免费网站ktv| 4438全国成人免费| 九九九伊在线综合永久| 国产精品一区二区三区毛片淫片| 91亚洲精品| 亚洲一区二区在线| aaa国产精品视频| 精品一区二区三区自拍图片区 | 国产又大又长又粗又黄| 亚洲一区二区日韩| heyzo亚洲| 日韩黄色免费网站| 日韩av一卡二卡三卡| 成人午夜av影视| 老司机福利av| 中文字幕一区二区三区乱码在线| 日本55丰满熟妇厨房伦| 成人三级在线视频| 国产毛片久久久久久久| 欧美激情中文字幕一区二区| 精品国产视频一区二区三区| 亚洲午夜在线视频| 无码人妻精品一区二区三区蜜桃91| 欧美亚洲一区三区| 国产免费久久久| 日韩av在线免费看| 日本中文字幕在线播放| 久久97久久97精品免视看| 欧美gv在线| 国产主播喷水一区二区| 欧美理论电影在线精品| 亚洲巨乳在线观看| 影音先锋亚洲精品| 性刺激的欧美三级视频| 成人精品国产一区二区4080| 久久久久久久久久久久| 不卡一区二区在线| 干b视频在线观看| 亚洲激情中文1区| 波多野结衣mp4| 精品久久一二三区| 99中文字幕一区| 97香蕉超级碰碰久久免费软件| 97欧美成人| 久久一区二区三区av| 久久久久久久久国产一区| 国产精品无码av在线播放| 久久99精品国产.久久久久久| 一级特级黄色片| 亚洲欧美精品午睡沙发| 久久久久久久久久久影院| 日韩一卡二卡三卡| av在线播放免费| 欧洲亚洲在线视频| 凹凸av导航大全精品| 国产大尺度在线观看| 天堂久久一区二区三区| 秘密基地免费观看完整版中文 | 亚洲免费一区| 鲁丝片一区二区三区| 欧美性色综合| 91亚洲精品久久久蜜桃借种| 久久免费午夜影院| 日韩精品一卡二卡| 日韩三级在线观看| 欧美人xxx| 国产精品专区第二| 少妇精品久久久| 黄色片视频在线播放| 96av麻豆蜜桃一区二区| 麻豆一区二区三区精品视频| 欧美一区二区三区不卡| 黄网页在线观看| 国产日韩欧美91| 欧美亚洲国产精品久久| 成年人黄色片视频| 91美女视频网站| 天堂网一区二区三区| 亚洲国产小视频在线观看| 欧美1234区| 国产精品果冻传媒潘| 欧美成人嫩草网站| 亚洲精品视频三区| 国产精品护士白丝一区av| 亚洲国产无线乱码在线观看| 亚洲日韩欧美视频| 欧洲一区二区三区精品| 日本不卡二区| 日韩黄色小视频| 日本女人性生活视频| 欧美日韩成人综合天天影院| 日本免费在线观看| 91老司机在线| 欧美激情一区| 一级黄色电影片| 午夜精品福利视频网站| 日本ー区在线视频| 国产福利视频一区二区| 青草国产精品| 天天综合成人网| 一区二区成人在线| 日本高清视频免费看| 777午夜精品福利在线观看| 亚洲精品小区久久久久久| 熟女少妇精品一区二区| 亚洲国产高清不卡| 国产内射老熟女aaaa∵| 欧美激情亚洲另类| 欧美亚洲色图校园春色| 日韩免费高清在线| 自拍偷自拍亚洲精品播放| 国产肥老妇视频| 98精品国产高清在线xxxx天堂| 九九视频精品全部免费播放| 亚洲国产精品三区| 亚洲美女偷拍久久| 少妇又色又爽又黄的视频| 国产91在线播放九色快色| 久久久久蜜桃| 一边摸一边做爽的视频17国产| 日韩欧美国产成人| 婷婷激情在线| 国产一区二区视频在线免费观看| 日韩中文字幕不卡| 精品欧美一区二区久久久久| 日韩精品免费在线观看| 亚洲欧美专区| 黄网站欧美内射| 国产精品婷婷午夜在线观看| 黄色片一区二区| 国产精品v片在线观看不卡| 亚洲乱码精品| 中文字幕一区二区人妻在线不卡| 精品视频1区2区| 999精品网| 艳母动漫在线免费观看| 91麻豆swag| 精品人妻无码一区二区色欲产成人 | 666av成人影院在线观看| 特级西西人体www高清大胆| 国产欧美日韩亚州综合| 高h放荡受浪受bl|