< UIKit >

UIControl.h

2019-06-19  本文已影响0人  zhYx_

#if USE_UIKIT_PUBLIC_HEADERS || !__has_include(<UIKitCore/UIControl.h>)
//
//  UIControl.h
//  UIKit
//
//  Copyright (c) 2005-2018 Apple Inc. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIView.h>
#import <UIKit/UIKitDefines.h>



NS_ASSUME_NONNULL_BEGIN

/* 手势类型 <位移枚举> */
typedef NS_OPTIONS(NSUInteger, UIControlEvents) {
    UIControlEventTouchDown                                         = 1 <<  0,  /// 刚刚按下
    UIControlEventTouchDownRepeat                                   = 1 <<  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,  /// 拖动或其他方式操纵控件,使其发出一系列不同的值
    UIControlEventPrimaryActionTriggered NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 13,  /// 按钮触发的语义动作

    UIControlEventEditingDidBegin                                   = 1 << 16,  /// 触摸通过输入其边界在UITextField对象中启动编辑会话
    UIControlEventEditingChanged                                    = 1 << 17,  /// 触摸使对象中的编辑更改
    UIControlEventEditingDidEnd                                     = 1 << 18,  /// 触摸通过离开其边界来结束对象中的编辑会话
    UIControlEventEditingDidEndOnExit                               = 1 << 19,  /// 触摸结束对象中的编辑会话('返回键'结束编辑)

    UIControlEventAllTouchEvents                                    = 0x00000FFF,   /// 所有触摸事件
    UIControlEventAllEditingEvents                                  = 0x000F0000,   /// 对象的所有编辑触摸(UITextField)
    UIControlEventApplicationReserved                               = 0x0F000000,   /// application可使用的一系列控制事件值
    UIControlEventSystemReserved                                    = 0xF0000000,   /// 为内部框架使用保留的一系列控制事件值
    UIControlEventAllEvents                                         = 0xFFFFFFFF    /// 所有事件(包括系统事件)
};

/* 控件内部垂直对齐方式 <枚举> */
typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) {
    UIControlContentVerticalAlignmentCenter  = 0,   /// 居中对齐
    UIControlContentVerticalAlignmentTop     = 1,   /// 顶部对齐
    UIControlContentVerticalAlignmentBottom  = 2,   /// 底部对齐
    UIControlContentVerticalAlignmentFill    = 3,   /// 填充对齐(图像可能会被拉伸)
};

/* 控件内部水平对齐方式 <枚举> */
typedef NS_ENUM(NSInteger, UIControlContentHorizontalAlignment) {
    UIControlContentHorizontalAlignmentCenter = 0,  /// 居中对齐
    UIControlContentHorizontalAlignmentLeft   = 1,  /// 左对齐
    UIControlContentHorizontalAlignmentRight  = 2,  /// 右对齐
    UIControlContentHorizontalAlignmentFill   = 3,  /// 填充对齐(图像可能会被拉伸)
    UIControlContentHorizontalAlignmentLeading  API_AVAILABLE(ios(11.0), tvos(11.0)) = 4,   /// 动态左对齐(左侧语言习惯的从左到右对齐,右侧语言习惯的从右到左对齐)
    UIControlContentHorizontalAlignmentTrailing API_AVAILABLE(ios(11.0), tvos(11.0)) = 5,   /// 动态右对齐(左侧语言习惯的从右到左对齐,右侧语言习惯的从左到右对齐)
};

/* 控件状态 <位移枚举> */
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
};

@class UITouch;
@class UIEvent;





#pragma mark - 操控类
#pragma mark -
/*
 概述:
    - 控制类控件的基类,它是为响应用户交互而传达特定操作或意图的可视元素,不能直接使用UIControl类,他只是定义了子类都需要使用的方法
    - 采用了一种新的事件处理机制,将前一节指节处理的触摸事件直接转换为简单操作,这样可以无需关心用户访问控件的具体方式;触摸事件到达UIControl对象(由响应链者派遣)后,在UIResponder的方法中(如:touchBegin:withEvent)中,UIControl将标准的触摸事件转换为特殊的控件事件,简单的理解就是,UIControl把复杂的触摸事件封装成了简单的易于使用的控件事件;例如通过UIControl对象处理后,按下按钮的事件就被封装成一个控件事件,而不用去判断触摸屏幕的整个操作过程
 */
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIControl : UIView

/// 是否开启用户交互(默认YES)
@property(nonatomic,getter=isEnabled) BOOL enabled;
/// 是否处于选中状态(默认NO)
@property(nonatomic,getter=isSelected) BOOL selected;
/// 是否处于高亮状态(默认NO)
@property(nonatomic,getter=isHighlighted) BOOL highlighted;

/* 控件包含可配置文本或图像时此属性才有效 */
/// 控件内部垂直对齐方式(默认:UIControlContentVerticalAlignmentCenter)
@property(nonatomic) UIControlContentVerticalAlignment contentVerticalAlignment;
/// 控件内部水平对齐方式(默认:UIControlContentHorizontalAlignmentCenter)
@property(nonatomic) UIControlContentHorizontalAlignment contentHorizontalAlignment;
/// 控件内部水平对齐方式(动态水平对齐;详情参照此枚举注释)
@property(nonatomic, readonly) UIControlContentHorizontalAlignment effectiveContentHorizontalAlignment;

/// 控件状态(可以多种状态并存)
@property(nonatomic,readonly) UIControlState state;

/// 是否正在追踪触摸事件
@property(nonatomic,readonly,getter=isTracking) BOOL tracking;
/// 追踪的触摸事件是否在控件范围内(仅在tracking为YES时有效)
@property(nonatomic,readonly,getter=isTouchInside) BOOL touchInside; // valid during tracking only

// 追踪触摸事件开始时调用(如果继续跟踪返回YES,否则返回NO)
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event;
// 追踪触摸事件更新时调用
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event;
// 追踪触摸事件结束时调用(如果调用了- cancelTrackingWithEvent:可能不会调用此方法)
- (void)endTrackingWithTouch:(nullable UITouch *)touch withEvent:(nullable UIEvent *)event;
// 追踪触摸事件取消时调用
- (void)cancelTrackingWithEvent:(nullable UIEvent *)event;

/**
 控件添加点击事件(可以多次调用此方法,添加多个操作)

 @param target 添加监听者(一般为self)
 @param action 封装一个执行方法(@selector(方法名);方法必须实现,否则会Crash)
 @param controlEvents 控制事件(哪种手势触发)
 */
- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
// 删除点击事件
- (void)removeTarget:(nullable id)target action:(nullable SEL)action forControlEvents:(UIControlEvents)controlEvents;

// 获取所有的 点击事件 和 触发手势
#if UIKIT_DEFINE_AS_PROPERTIES
@property(nonatomic,readonly) NSSet *allTargets;
@property(nonatomic,readonly) UIControlEvents allControlEvents;
#else
- (NSSet *)allTargets;
- (UIControlEvents)allControlEvents;
#endif

// 查找指定对象和手势后所包含的操作方法
- (nullable NSArray<NSString *> *)actionsForTarget:(nullable id)target forControlEvent:(UIControlEvents)controlEvent;
// 调用指定的操作方法
- (void)sendAction:(SEL)action to:(nullable id)target forEvent:(nullable UIEvent *)event;
// 调用与指定手势关联的所有方法
- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents;

@end





NS_ASSUME_NONNULL_END

#else
#import <UIKitCore/UIControl.h>
#endif

上一篇 下一篇

猜你喜欢

热点阅读