UIButton 繼承樹

繼承樹

UIButton -> UIControl -> UIView -> UIResponder -> NSObject

UIKit

NSObject

所有 Objective-C 對象的基類,封裝了內存管理,消息的傳遞機制等底層邏輯。

UIResponder

UIResponder 定義了響應和處理事件的接口。它是 UIApplication 和 UIView 的父類,而 UIView 則是 UIWindow 的父類。

有兩種一般事件:

  • 點擊事件(Touche Events)
  • 手勢事件(Motion Events)

除此之外還有:

  • 遠程控制事件(Remote Control Events)
  • 重壓事件(Press Events)(iOS 9.0 3D Touch)

點擊 事件的主要處理方法有:

  • touchesBegan:withEvent:
  • touchesMoved:withEvent:
  • touchesEnded:withEvent:
  • touchesCancelled:withEvent:.

iOS 3.0 引入了 手勢 事件,特別是搖一搖。

iOS 4.0 增加了遠程控制事件,包括控制中心和耳機線控:

iOS 控制中心

UIView

UIView 定義了一個屏幕上的矩形區域,以及管理這個區域內容的接口。UIView 提供了一個基本行為就是為這個矩形區域填充背景色(Background Color)。

UIControl

UIControl 是 UIButton,UISwitch,UITextField 以及 UISegmentedControl 等類的父類。

不要使用 UIControl 的實例,而是寫 UIControl 的子類。

UIControl 子類的主要工作就是將 UIResponder 收集到的復雜事件,變成簡單的控制事件(UIControl Events)。而為了實現這個過程,UIControl 引入了 Target-Action 機制。

typedef NS_OPTIONS(NSUInteger, UIControlEvents) {
    UIControlEventTouchDown                                         = 1 <<  0,      // on all touch downs
    UIControlEventTouchDownRepeat                                   = 1 <<  1,      // on multiple touchdowns (tap count > 1)
    UIControlEventTouchDragInside                                   = 1 <<  2,
    UIControlEventTouchDragOutside                                  = 1 <<  3,
    UIControlEventTouchDragEnter                                    = 1 <<  4,
    UIControlEventTouchDragExit                                     = 1 <<  5,
    UIControlEventTouchUpInside                                     = 1 <<  6,
    UIControlEventTouchUpOutside                                    = 1 <<  7,
    UIControlEventTouchCancel                                       = 1 <<  8,

    UIControlEventValueChanged                                      = 1 << 12,     // sliders, etc.
    UIControlEventPrimaryActionTriggered NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 13,     // semantic action: for buttons, etc.

    UIControlEventEditingDidBegin                                   = 1 << 16,     // UITextField
    UIControlEventEditingChanged                                    = 1 << 17,
    UIControlEventEditingDidEnd                                     = 1 << 18,
    UIControlEventEditingDidEndOnExit                               = 1 << 19,     // 'return key' ending editing

    UIControlEventAllTouchEvents                                    = 0x00000FFF,  // for touch events
    UIControlEventAllEditingEvents                                  = 0x000F0000,  // for UITextField
    UIControlEventApplicationReserved                               = 0x0F000000,  // range available for application use
    UIControlEventSystemReserved                                    = 0xF0000000,  // range reserved for internal framework use
    UIControlEventAllEvents                                         = 0xFFFFFFFF
};

此外,UIControl 還定義了狀態 UIControlState。

typedef NS_OPTIONS(NSUInteger, UIControlState) {
    UIControlStateNormal       = 0,
    UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set
    UIControlStateDisabled     = 1 << 1,
    UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)
    UIControlStateFocused NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 3, // Applicable only when the screen supports focus
    UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use
    UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use
};

UIButton

UIButton 將 UIResponder 接受的 Events 處理成簡單事件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 好奇觸摸事件是如何從屏幕轉移到APP內的?困惑于Cell怎么突然不能點擊了?糾結于如何實現這個奇葩響應需求?亦或是...
    Lotheve閱讀 57,990評論 51 603
  • 在開發過程中,大家或多或少的都會碰到令人頭疼的手勢沖突問題,正好前兩天碰到一個類似的bug,于是借著這個機會了解了...
    閆仕偉閱讀 5,412評論 2 23
  • 在iOS開發中經常會涉及到觸摸事件。本想自己總結一下,但是遇到了這篇文章,感覺總結的已經很到位,特此轉載。作者:L...
    WQ_UESTC閱讀 6,118評論 4 26
  • 7、不使用IB是,下面這樣做有什么問題? 6、請說說Layer和View的關系,以及你是如何使用它們的。 1.首先...
    AlanGe閱讀 719評論 0 1
  • iOS中有三類事件:UIEventTypeTouches觸摸事件、 UIEventTypeMotion “動作”事...
    WeiHing閱讀 37,144評論 7 69