精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩欧美综合| 91在线精品一区二区三区| 动漫av一区二区三区| 亚洲一区二区三区精品动漫| 日本道精品一区二区三区| 欧美成a人免费观看久久| 欧美偷拍第一页| 亚洲午夜精品久久久久久性色 | 国产精品久久久久999| 国产激情91久久精品导航 | 久久精品免费在线观看| 日韩脚交footjobhd| 无码人妻一区二区三区免费n鬼沢| 欧美成人剧情片在线观看| 在线免费av资源| 国产不卡的av| 精品国产一区二区三区在线观看 | 欧美三级在线播放| 激情久久综合| 亚洲产国偷v产偷v自拍涩爱| 久久爱av电影| 欧美性猛交xxxx黑人猛交| 国产原创一区| 99re久久精品国产| 欧美激情在线观看| 国产精品亚洲午夜一区二区三区 | 欧美连裤袜在线视频| 亚洲午夜视频在线观看| 日韩pacopacomama| 久久精品女人| 手机看片国产日韩| 国产一区二区三区在线观看视频 | 美女在线视频一区二区| 久久中文字幕在线视频| 久久婷婷综合激情| 亚洲日本网址| 亚洲激情图片网| 国产精品第2页| 91久久精品一区二区三区| 在线日韩影院| 魔女鞋交玉足榨精调教| 日韩精品在线看| 丝袜美腿亚洲综合| 亚洲制服国产| 中文天堂资源在线| 91精品视频在线看| 中文字幕一区二区三区在线播放| jizz久久久久久| 国产又粗又硬又长又爽| 国产精品福利在线观看网址| 日本孕妇大胆孕交无码| 一级黄色电影片| 欧美中文在线字幕| 成人欧美一区二区三区黑人麻豆 | 日韩av不卡电影| 国产女主播一区| 黄色美女一级片| 99精彩视频| 91国偷自产一区二区开放时间 | 色诱亚洲精品久久久久久| 国产99久久久国产精品成人免费| 成人黄色av片| 欧美亚洲图片小说| 日韩亚洲在线| 黄色av网站在线| 国产999免费视频| 国产精品伦子伦免费视频| 午夜精品久久久久影视| 欧美理论在线播放| 欧美理论在线观看| 91网站免费视频| 亚洲精品720p| 久久久久久久久久久妇女| 久久精品国产亚洲a∨麻豆| www.超碰97| 成人做爰www免费看视频网站| 91豆麻精品91久久久久久| 国产精品入口| 卡通欧美亚洲| 神马久久久久久久| 午夜精品在线免费观看| 久久99视频免费| 亚洲中国最大av网站| 盗摄牛牛av影视一区二区| 亚洲中文一区二区三区| 日韩小视频在线播放| 不卡av日日日| 色综合激情久久| 秋霞电影网一区二区| 国模冰冰炮一区二区| 日本久久综合网| 搡女人真爽免费午夜网站| 国产精品毛片a∨一区二区三区|国| 日韩天堂av| 黄色污污视频在线观看| 国产一区二区视频网站| 91九色蝌蚪porny| 视频一区视频二区视频三区视频四区国产| 最新日韩中文字幕| 色综合久久久久网| 国产在线国偷精品免费看| 国产在线一区不卡| 男人av在线| 欧美日韩免费做爰视频| 第一区免费在线观看| 一区二区日韩| 最新日本在线观看| 97免费观看视频| 中文字幕在线观看2018| 污污网站在线观看视频| 亚洲国产精品综合| 国产精品一区二区久久精品| 一区二区三区动漫| 欧美日韩一区二区三区高清| 色综合天天做天天爱| 国产一区二区视频在线| 久久夜色电影| 免费a级在线播放| 麻豆成人在线视频| 最新中文字幕久久| 欧美黄色三级网站| 亚洲精品在线三区| 亚洲美女色禁图| 国模私拍视频在线播放| 99热99这里只有精品| 国产一级爱c视频| 涩涩涩999| 青青久久av北条麻妃黑人| 日韩一区二区三区视频在线观看| 久久久精品tv| 亚洲久久一区| 国产一区二区观看| 免费高清在线观看| 一区二区三区免费在线| www色aa色aawww| 日本成人xxx| 欧美激情亚洲天堂| 久久久com| 欧美日韩国产一二三| 青青草原综合久久大伊人精品优势 | 亚洲欧美日本一区| 妺妺窝人体色www在线小说| 精品综合在线| 国产精品入口日韩视频大尺度 | 欧美二区不卡| 男人的天堂久久| 三级中文字幕在线观看| 人妻一区二区三区四区| 日本黄色免费片| 天天干天天操天天玩| 国产97在线观看| 正在播放国产一区| 欧美一区二区观看视频| 欧美三级三级三级| 国产a久久精品一区二区三区| 成人看片毛片免费播放器| 免费在线看a| 欧美视频综合| 日本人妻熟妇久久久久久 | 99国产精品久久一区二区三区| 嫩草伊人久久精品少妇av杨幂| 亚洲制服国产| 亚洲电影视频在线| a在线免费观看| www.毛片com| 久久发布国产伦子伦精品| 污污网站在线观看视频| 日韩精品aaa| 人妻换人妻仑乱| 97超碰人人爽| 国产又粗又猛又爽又黄| 欧美国产在线一区| 中国黄色片视频| 精品久久久久一区二区| 久久出品必属精品| 日本网站在线看| 欧美图片自拍偷拍| 无码一区二区三区在线| 精品人伦一区二区三电影| 国产调教在线观看| 欧美激情国产精品免费| 久草手机在线视频| 97人妻精品一区二区三区视频| 国产ts人妖调教重口男| 理论片中文字幕| 欧美性x x x| 永久免费毛片在线观看| 久久久久久久久久97| 日韩av免费网址| 国产精品人人妻人人爽| 日av在线播放| 蜜桃视频在线观看网站| 在线视频二区| 日本蜜桃在线观看视频| 日本肉肉一区| 国产精品极品在线观看| 成人一区而且| 老司机免费视频久久| 懂色中文一区二区在线播放| 国产精品成人免费在线| 午夜久久久久久电影| 91精品国产综合久久福利软件 | 欧美一区二区.| 97人人做人人人难人人做| 三区精品视频| 日日噜噜噜噜久久久精品毛片| 日韩av影视大全| 久草综合在线视频| 欧美高清69hd| 国产中文字幕在线播放| 99爱在线视频| 草草视频在线一区二区| 亚洲精品电影| 久久精品官网| 99久久婷婷国产综合精品电影| 一区二区三区在线观看网站| 欧美一区二区视频在线观看2022 | 动漫av一区| 在线欧美一区| 亚洲视频精选| 欧美日韩国产综合网| 粉嫩嫩av羞羞动漫久久久| 亚洲久草在线视频| 色婷婷久久久综合中文字幕| 欧美一区二区三区视频免费播放| 色噜噜狠狠色综合网图区| 久久99热这里只有精品国产| 米奇精品一区二区三区在线观看| 国产精品久久久久久超碰| 成人性教育视频在线观看| 欧美日韩一区二区三区在线视频| 亚洲图片小说在线| 午夜精品在线免费观看| 日本aaa视频| 亚洲专区在线播放| 国产激情在线观看| 亚洲国产aⅴ精品一区二区三区| 久久久精品国产**网站| 在线毛片网站| 午夜影院在线视频| 欧美成人a交片免费看| 亚洲精华一区二区三区| 国产日本精品| 国产精品久久久久影院亚瑟| 亚洲精品久久久久久下一站 | 日本vs亚洲vs韩国一区三区二区 | 香蕉国产在线视频| 国产在线88av| 第一社区sis001原创亚洲| 久草精品在线观看| 亚洲制服欧美中文字幕中文字幕| 亚洲欧美综合另类中字| 午夜美女久久久久爽久久| 欧美日韩国产影片| 久久91亚洲精品中文字幕| 亚洲综合视频一区| 国产精品视频大全| 91蝌蚪视频在线| 国产chinasex对白videos麻豆| 在线观看一二三区| 日韩中文字幕一区二区高清99| 久久精品成人| 3atv一区二区三区| 久99久视频| 日本精品人妻无码77777| 亚洲国产精品免费在线观看| 国产白浆在线观看| 久久狠狠久久| 日韩美女久久久| 国产91视觉| 国产av自拍一区| 精品国产一区二区三区四| 成人在线啊v| 国产欧美日韩激情| 欧美国产日韩在线| 国产一级不卡毛片| 色综合久久久久久| 中文字幕一区二区三三| 欧美午夜丰满在线18影院| 91精品国产高清久久久久久91裸体| 亚欧洲乱码视频| 丝袜老师在线| 91美女视频网站| 国内成人精品一区| caopor在线| 超清av在线| 裸体一区二区三区| 精品久久久久久久人人人人传媒| 中文字幕日韩专区| 国产精品偷伦免费视频观看的| jizz日本免费| 丰乳肥臀在线| 日本亚洲最大的色成网站www| 亚洲图片在线综合| 88av.com| 99国产成人精品| 欧美高清在线| 一本色道a无线码一区v| 久久精品最新地址| 黄色高清无遮挡| 亚欧在线观看视频| 极品少妇一区二区三区| 亚洲第一网站男人都懂| a级免费在线观看| 亚洲精品.www| 国产精品日本| 国产91丝袜在线18| 午夜精品福利在线| 97人人模人人爽人人喊中文字 | 日韩中文字幕在线不卡| 中文字幕一二区| 91精品国产麻豆国产在线观看 | a√中文在线观看| 成人av免费网站| 91国产精品电影| jizz18女人高潮| **精品中文字幕一区二区三区| 久久久久久麻豆| 国产高清自拍99| 中文字幕1区2区3区| 亚洲欧美高清| 91精品国产色综合久久不卡98口| 亚洲精品国产精品国自产网站| 人人精品久久| 红桃av永久久久| 精品无人区一区二区三区| www.久久网| 日本不卡视频一二三区| 欧美激情视频三区| 37p粉嫩大胆色噜噜噜| 精品午夜视频| 亚洲一区二区三区激情| 青娱乐一区二区| 久久露脸国语精品国产91| 欧美午夜一区| 久久精品国产亚洲精品| 激情小说中文字幕| 欧美激情四色| jizz性欧美2| 成人免费毛片嘿嘿连载视频…| 亚洲成av人片在线观看无码| 美女av免费观看| yw193.com尤物在线| 福利一区在线观看| 国产91免费观看| 青青操免费在线视频| 99久久综合| 国产亚洲一区二区精品| 国产ts丝袜人妖系列视频| 黄色在线网站噜噜噜| 亚洲激情图片qvod| 免费在线看黄色片| av网站导航在线观看免费| 国产精品一级片| 成人xxxxx色| 天堂а√在线8种子蜜桃视频| 成人免费高清视频| 麻豆精品蜜桃一区二区三区| av一区二区三| 国产91精品一区二区麻豆网站| 国产成一区二区| 一区二区视频免费| 国产成人在线网站| 久久99精品国产99久久| 香蕉人妻av久久久久天天| 不卡视频免费播放| 人禽交欧美网站免费| av在线播放网站| 亚洲一区二区五区| 国产一级不卡毛片| 亚洲不卡视频| 中文字幕亚洲天堂| 青娱乐91视频| 亚洲精品激情| 国产精品成人免费电影| 国产美女免费视频| av电影一区二区| 亚洲影院在线观看| 国产精品69久久久| 亚洲热av色在线播放| 日韩欧美一二三| 久久精品女同亚洲女同13| 久久久久蜜桃| 日韩免费av一区二区| av中文字幕在线免费观看| 久久伊人中文字幕| 妺妺窝人体色www看人体| 欧美xx视频| 亚洲国产精品999| www.5588.com毛片| 欧美bbbbb| 麻豆中文字幕在线观看| 午夜日韩成人影院| 精品国产乱子伦一区| 久久久久久久国产精品毛片| 伊人精品在线| 精品欧美一区二区三区久久久| 欧美性受ⅹ╳╳╳黑人a性爽| 欧美性生交大片免网| 熟女人妻在线视频|