由“點擊頭像放大”想開去

在使用微信查看聯(lián)系人頭像的時候界轩,可以點擊頭像使之放大、進而填充整個window衔瓮,可以對大圖
進行雙擊浊猾、縮放、平移等操作热鞍,總的來說這個過程的編碼也不復(fù)雜葫慎,但是涉及到UIWindow、手勢
識別方面的知識薇宠,有必要總結(jié)一下偷办。

UIWindow

UIWindow是一種特殊的UIView,我們一般在程序中這樣來指定App的UIWindow:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    UITabBarController * tabBarController = [[UITabBarController alloc] init];
    self.window.rootViewController = tabBarController;
    
    [self.window makeKeyAndVisible];
    return YES;
}

一個App中通常只有一個UIWindow昼接,作為所有視圖的容器爽篷。在編碼的過程中這樣來獲得App的keyWindow:

UIWindow *window = [UIApplication sharedApplication].keyWindow;

當(dāng)然,我們也可以手動創(chuàng)建多個UIWindow慢睡,多個Window的顯示順序是根據(jù)UIWindowLevel進行排序的逐工,
IOS默認(rèn)定義了三個等級:

const UIWindowLevel UIWindowLevelNormal;    //0.0
const UIWindowLevel UIWindowLevelAlert;     //2000.0
const UIWindowLevel UIWindowLevelStatusBar; //1000.0

值得注意的是:UIWindow是嚴(yán)格按照Level來顯示的,與keyWindow的設(shè)置順序無關(guān)漂辐,在使用的
過程中常用的場景是需要全屏幕覆蓋一個蒙層泪喊。

事件處理

任何一款移動設(shè)備都會有事件處理,允許操作系統(tǒng)能夠?qū)τ脩舻牟僮鬟M行響應(yīng)髓涯,IOS中的用戶事件
分為三種:

1. 觸摸事件:通過觸摸袒啼、手勢進行觸發(fā)
2. 運動事件:通過加速器進行觸發(fā),例如手機晃動
3. 遠(yuǎn)程控制事件:遠(yuǎn)程設(shè)備觸發(fā),例如耳機控制按鈕

IOS中只有繼承UIResponder類的對象才能處理事件蚓再,比如我們常用的UIView滑肉、UIViewController、
UIApplication摘仅。UIResponder中包含了對三種事件的處理方法靶庙,如果我們需要實現(xiàn)哪種事件的響應(yīng)
邏輯,我們就需要覆蓋這些方法:

觸摸事件     
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;   一根或多根手指開始觸摸屏幕時執(zhí)行娃属;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;   一根或多根手指在屏幕上移動時執(zhí)行六荒,注意此方法在移動過程中會重復(fù)調(diào)用;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;   一根或多根手指觸摸結(jié)束離開屏幕時執(zhí)行矾端;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;   觸摸意外取消時執(zhí)行(例如正在觸摸時打入電話)掏击;
運動事件     
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event NS_AVAILABLE_IOS(3_0);    運動開始時執(zhí)行;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event NS_AVAILABLE_IOS(3_0);    運動結(jié)束后執(zhí)行秩铆;
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event NS_AVAILABLE_IOS(3_0);    運動被意外取消時執(zhí)行砚亭;
遠(yuǎn)程控制事件   
- (void)remoteControlReceivedWithEvent:(UIEvent *)event NS_AVAILABLE_IOS(4_0);  接收到遠(yuǎn)程控制消息時執(zhí)行;

手勢處理

通過覆蓋UIResponder的方法豺旬,我們可以處理觸摸事件钠惩,然而我們在使用iphone的時候,每一個手勢
都是一系列觸摸事件的集合族阅,所以蘋果引入了手勢識別篓跛,并封裝成具體的類,這樣開發(fā)者就不
需要編寫識別算法了坦刀。

UITapGestureRecognizer       點按手勢
UIPinchGestureRecognizer     捏合手勢
UIPanGestureRecognizer       拖動手勢
UISwipeGestureRecognizer     輕掃手勢愧沟,支持四個方向的輕掃,但是不同的方向要分別定義輕掃手勢
UIRotationGestureRecognizer  旋轉(zhuǎn)手勢
UILongPressGestureRecognizer 長按手勢

手勢處理是對觸摸事件的集合鲤遥,其中會有很多中間狀態(tài)沐寺,比如說識別開始、識別中盖奈、識別失敗或者
識別成功等等混坞,所以其實現(xiàn)其實是一個有限狀態(tài)自動機,常用的狀態(tài)有:

UIGestureRecognizerStateBegan       //開始
UIGestureRecognizerStateChanged     //狀態(tài)變化
UIGestureRecognizerStateEnded       //識別結(jié)束=識別成功

每一次狀態(tài)的變更都會導(dǎo)致手勢的響應(yīng)selector被調(diào)用钢坦,所以我們一般在selector中對這幾種
狀態(tài)做區(qū)分處理究孕。

坐標(biāo)轉(zhuǎn)換

在做動畫的時候,可能會需要轉(zhuǎn)換坐標(biāo)系爹凹,比如厨诸,在cell中的button,我們要知道其在整個tableView
中的坐標(biāo)值禾酱,或者是其在屏幕中的位置微酬,我們就需要坐標(biāo)轉(zhuǎn)換绘趋,UIView提供了坐標(biāo)轉(zhuǎn)換的API,
不過我們得小心使用:

// 將像素point由point所在視圖轉(zhuǎn)換到目標(biāo)視圖view中颗管,返回在目標(biāo)視圖view中的像素值
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
// 將像素point從view中轉(zhuǎn)換到當(dāng)前視圖中陷遮,返回在當(dāng)前視圖中的像素值
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;

// 將rect由rect所在視圖轉(zhuǎn)換到目標(biāo)視圖view中,返回在目標(biāo)視圖view中的rect
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
// 將rect從view中轉(zhuǎn)換到當(dāng)前視圖中垦江,返回在當(dāng)前視圖中的rect
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;

上述實際上是坐標(biāo)系的轉(zhuǎn)換拷呆,toView是將當(dāng)前坐標(biāo)系中的矩形域轉(zhuǎn)化為view坐標(biāo)系中的矩形域,
而fromView則相反疫粥,將view坐標(biāo)系中的矩形框轉(zhuǎn)化為當(dāng)前坐標(biāo)系中的矩形框。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腰懂,一起剝皮案震驚了整個濱河市梗逮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绣溜,老刑警劉巖慷彤,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怖喻,居然都是意外死亡底哗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門锚沸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跋选,“玉大人,你說我怎么就攤上這事哗蜈∏氨辏” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵距潘,是天一觀的道長炼列。 經(jīng)常有香客問我,道長音比,這世上最難降的妖魔是什么俭尖? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮洞翩,結(jié)果婚禮上稽犁,老公的妹妹穿的比我還像新娘。我一直安慰自己菱农,他們只是感情好缭付,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著循未,像睡著了一般陷猫。 火紅的嫁衣襯著肌膚如雪秫舌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天绣檬,我揣著相機與錄音足陨,去河邊找鬼。 笑死娇未,一個胖子當(dāng)著我的面吹牛墨缘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播零抬,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼镊讼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了平夜?” 一聲冷哼從身側(cè)響起蝶棋,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忽妒,沒想到半個月后玩裙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡段直,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年吃溅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸯檬。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡决侈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出京闰,到底是詐尸還是另有隱情颜及,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布蹂楣,位于F島的核電站俏站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痊土。R本人自食惡果不足惜肄扎,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赁酝。 院中可真熱鬧犯祠,春花似錦、人聲如沸酌呆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隙袁。三九已至痰娱,卻和暖如春弃榨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梨睁。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工鲸睛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坡贺。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓官辈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遍坟。 傳聞我的和親對象是個殘疾皇子拳亿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點擊了愿伴?糾結(jié)于如何實現(xiàn)這個奇葩響應(yīng)需求风瘦?亦或是...
    Lotheve閱讀 57,301評論 51 599
  • 在iOS開發(fā)中經(jīng)常會涉及到觸摸事件。本想自己總結(jié)一下公般,但是遇到了這篇文章,感覺總結(jié)的已經(jīng)很到位胡桨,特此轉(zhuǎn)載官帘。作者:L...
    WQ_UESTC閱讀 6,024評論 4 26
  • 手勢識別器是附加到視圖的對象,將低級別事件處理代碼轉(zhuǎn)換為更高級別的操作昧谊,它允許視圖以控件執(zhí)行的方式響應(yīng)操作刽虹。 手勢...
    坤坤同學(xué)閱讀 4,091評論 0 9
  • 在第十八章中,您通過實現(xiàn) UIResponder 的方法來處理原始觸摸呢诬。 有時你想檢測一個特定的觸摸模式——手勢涌哲,...
    titvax閱讀 1,276評論 6 3
  • 7、不使用IB是尚镰,下面這樣做有什么問題阀圾? 6、請說說Layer和View的關(guān)系狗唉,以及你是如何使用它們的初烘。 1.首先...
    AlanGe閱讀 683評論 0 1