UIAccessibility是在UIKit里的一個非正式協(xié)議,提供關于UI元素的輔助功能。這個信息能夠通過VoiceOver和其他輔助科技幫助肢體障礙者用戶與你的用戶進行交互。
UIAccessibility所有屬性的列表:
//控件的識別符,默認值為nil
accessibilityLabel
//操作后的提示
//是對控件執(zhí)行操作后結果的簡單描述,而不識別控件和操作。
//例如,包含電子郵件消息的表行的提示可能是“選擇消息”,但不是“點擊此行以選擇消息”。
accessibilityHint:
//控件具體值
//當輔助功能元素具有靜態(tài)標簽和動態(tài)值, accessibilityValue為動態(tài)值
//如textfield控件的標示屬性為accessibilityLabel,對應輸入框的文本值屬性為accessibilityValue
accessibilityValue
//控件語言屬性
accessibilityLanguage
//控件的特性
//控件的種類信息,使用了UIAccessibiltyTraits為值的位掩碼,這個屬性可以由文檔里指定好幾個屬性結合而成。如自定義按鈕顯示一張圖片,點擊播放聲音,則控件的特征為“按鈕”,“圖片”,“播放聲音”。
accessibilityTraits
//控件的位置信息
//具體指的是在屏幕上的大小和位置信息
accessibilityFrame
//控件激活點
//默認為accessibilityFrame中心點,但也有列外如長按刪除應用,控件激活點為圖標左上角的圓圈叉
accessibilityActivationPoint
//控件隱藏
//使用此屬性來隱藏控件。在這種情況下,隱藏的控件可能在屏幕上可見,但它們無法進行操作。
accessibilityElementsHidden
//控件的組屬性
//默認值為no,若為yes VoiceOver將忽略該該控件,且包括該控件所在視圖中的其他控件
accessibilityViewIsModal
控件獲取
等待控件顯示(一)
相對通用的方法,衍生出三種api等待目標控件出現(xiàn),返回目標的UIView對象
定位目標對象參數(shù):
label(accessibilityLabel):控件的輔助功能標示
traits(accessibilityTraits):控件的輔助功能特性
value(accessibilityValue):控件的文本值,如textfield文本輸入滿足一定條件才符合條件
返回參數(shù):
UIView:控件對象指針
- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label;
- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits;
- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits;
等待控件顯示(二)
與等待控件顯示(一)基本一致,區(qū)別在于添加“可點擊”的約束
- (UIView *)waitForTappableViewWithAccessibilityLabel:(NSString *)label;
- (UIView *)waitForTappableViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits;
- (UIView *)waitForTappableViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits;
等待控件顯示(三)
通過傳址,將符合條件的控件對象進行賦值。
參數(shù):
賦值參數(shù)
element(UIAccessibilityElement **):傳址,將符合條件的對象存儲,類型為UIAccessibilityElement
view(out UIView **):傳址,將符合條件的對象存儲,類型為UIView
條件參數(shù)
label(accessibilityLabel):控件的輔助功能標示
fromView(UIView):遍歷符合條件的起始視圖
traits(UIAccessibilityTraits):控件的輔助功能特性
mustBeTappable(BOOL):是否可以點擊
- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits tappable:(BOOL)mustBeTappable;
- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits fromRootView:(UIView *)fromView tappable:(BOOL)mustBeTappable;
等待控件顯示(四)
利用邏輯約束(NSPredicate)等待符合條件的控件,與等待控件顯示(三)類型,差別是使用邏輯約束尋找目標控件
參數(shù):
賦值參數(shù)
element(UIAccessibilityElement **):傳址,將符合條件的對象存儲,類型為UIAccessibilityElement
view(out UIView **):傳址,將符合條件的對象存儲,類型為UIView
條件參數(shù)
predicate(NSPredicate *):邏輯約束
identifier(NSString *):邏輯約束NSString表達,函數(shù)內部會將其轉為為NSPredicate對象
mustBeTappable(BOOL):是否可點擊作為約束條件
- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withElementMatchingPredicate:(NSPredicate *)predicate tappable:(BOOL)mustBeTappable;
- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withIdentifier:(NSString *)identifier tappable:(BOOL)mustBeTappable;
- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withIdentifier:(NSString *)identifier fromRootView:(UIView *)fromView tappable:(BOOL)mustBeTappable;
等待控件消失
與等待控件顯示API的傳參一致,差別是等待控件消失
- (void)waitForAbsenceOfViewWithAccessibilityLabel:(NSString *)label;
- (void)waitForAbsenceOfViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits;
- (void)waitForAbsenceOfViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits;
- (void)waitForAbsenceOfViewWithElementMatchingPredicate:(NSPredicate *)predicate;
手勢操作
點擊
//方式一:
//通過accessibilityLabel尋找并點擊目標控件
//steup1.等待符合條件的控件(accessibilityLabel標示,accessibilityTraits特性,accessibilityValue文本值)
//steup2.點擊符合條件的控件
- (void)tapViewWithAccessibilityLabel:(NSString *)label;
- (void)tapViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits;
- (void)tapViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits;
//方式二:
//點擊指定視圖view中的UIAccessibilityElement對象
element(UIAccessibilityElement *):UIAccessibilityElement對象
view(UIView *):視圖
- (void)tapAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)view;
//方式三:點擊屏幕某個坐標
- (void)tapScreenAtPoint:(CGPoint)screenPoint;
長按
//方式一:
//通過accessibilityLabel尋找并點擊目標控件
//steup1.等待符合條件的控件(accessibilityLabel標示,accessibilityTraits特性,accessibilityValue文本值)
//steup2.長按符合條件的控件,長按時間為duration
- (void)longPressViewWithAccessibilityLabel:(NSString *)label duration:(NSTimeInterval)duration;
- (void)longPressViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value duration:(NSTimeInterval)duration;
- (void)longPressViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits duration:(NSTimeInterval)duration;
//方式二:
//長按指定視圖view中的UIAccessibilityElement對象,長按時間為duration
- (void)longPressAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)view duration:(NSTimeInterval)duration;
滑動
//方式一:
//根據(jù)accessibiltyLabel尋找符合條件的控件,并滑動
//horizontalFraction:水平滑動距離
//verticalFraction:垂直滑動距離
- (void)scrollViewWithAccessibilityLabel:(NSString *)label byFractionOfSizeHorizontal:(CGFloat)horizontalFraction vertical:(CGFloat)verticalFraction
//方式二:
//根據(jù)邏輯約束(identifier)尋找符合條件的控件,并滑動
//horizontalFraction:水平滑動距離
//verticalFraction:垂直滑動距離
- (void)scrollViewWithAccessibilityIdentifier:(NSString *)identifier byFractionOfSizeHorizontal:(CGFloat)horizontalFraction vertical:(CGFloat)verticalFraction
//方式三:
//滑動指定視圖view中的UIAccessibilityElement對象
//horizontalFraction:水平滑動距離
//verticalFraction:垂直滑動距離
- (void)scrollAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)viewToScroll byFractionOfSizeHorizontal:(CGFloat)horizontalFraction vertical:(CGFloat)verticalFraction;
輕掃
//方式一
//steup1.尋找符合條件的目標控件(accessibilityLabel標示,accessibilityTraits特性,accessibilityValue文本值)
//steup2.根據(jù)設定的方向值,輕掃目標控件
- (void)swipeViewWithAccessibilityLabel:(NSString *)label inDirection:(KIFSwipeDirection)direction;
- (void)swipeViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value inDirection:(KIFSwipeDirection)direction;
- (void)swipeViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits inDirection:(KIFSwipeDirection)direction;
//方式二
//輕掃指定視圖view中的UIAccessibilityElement對象,方向有direction指定
- (void)swipeAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)viewToSwipe inDirection:(KIFSwipeDirection)direction;
下拉刷新
//方式一
//steup1.尋找符合條件的目標控件(accessibilityLabel標示,accessibilityValue文本值)
//steup2.下拉目標控件,下拉持續(xù)時間由pullDownDuration設定
- (void)pullToRefreshViewWithAccessibilityLabel:(NSString *)label pullDownDuration:(KIFPullToRefreshTiming) pullDownDuration;
- (void)pullToRefreshViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value;
//方式二
//下拉刷新指定視圖view中的UIAccessibilityElement對象,下拉持續(xù)時間由pullDownDuration設定
- (void)pullToRefreshAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)viewToSwipe pullDownDuration:(KIFPullToRefreshTiming) pullDownDuration;
特殊控件操作
文本輸入操作
//方式一
//對第一響應的控件輸入文本,對于UIWebView/無輔助功能標示的控件較為有用
//對默認第一響應進行輸入
//text=@“\b”表明刪除一個字符,text=@“\b\b”表示刪除兩個字符,以此類推
- (void)enterTextIntoCurrentFirstResponder:(NSString *)text;
//判斷fallbackView是否是可輸入控件(UITextField,UITextView,UISearchBar),若是則輸入文本
//方式二
//對指定視圖中的UIAccessibilityElement輸入文本,element和view用于定位點擊操作,使得view作為第一響應可以輸入文本
//text:輸入的文本
//expectedResult:函數(shù)內部會拿該值去檢測完成輸入后的文本是否完全匹配expectedResult值
//類似斷言,即調用- (void)expectView:(UIView *)view toContainText:(NSString *)expectedResult方法
- (void)enterText:(NSString *)text intoElement:(UIAccessibilityElement *)element inView:(UIView *)view expectedResult:(NSString *)expectedResult;
- (void)expectView:(UIView *)view toContainText:(NSString *)expectedResult;
//方式三
//與方式二類事,不同在于尋找控件的條件不同(accessibilityLabel,accessibilityTraits)
- (void)enterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label;
- (void)enterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits expectedResult:(NSString *)expectedResult;
文案刪除操作
//方式一
//清除第一響應的文本
- (void)clearTextFromFirstResponder;
//方式二
//清除符合條件的控件文案
- (void)clearTextFromViewWithAccessibilityLabel:(NSString *)label;
- (void)clearTextFromViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits;
//方式三
//與方式二一致,尋找條件不一致
- (void)clearTextFromElement:(UIAccessibilityElement *)element inView:(UIView *)view;
//文案刪除后再輸入指定文案
- (void)clearTextFromAndThenEnterTextIntoCurrentFirstResponder:(NSString *)text;
- (void)clearTextFromAndThenEnterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label;
- (void)clearTextFromAndThenEnterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits expectedResult:(NSString *)expectedResult;
UITableView
//點擊
//TableView中的指定cell
//參數(shù):
//indexPath(NSIndexPath *):cell的索引值,-1為最后一個cell
//搜索參數(shù):AccessibilityLabel(輔助控件標示)/AccessibilityIdentifier(邏輯約束)/UITableView(控件指針)
- (void)tapRowInTableViewWithAccessibilityLabel:(NSString *)tableViewLabel atIndexPath:(NSIndexPath *)indexPath
- (void)tapRowAtIndexPath:(NSIndexPath *)indexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier
- (void)tapRowAtIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)tableView;
//等待
//TableView中的指定cell出現(xiàn)
//參數(shù)
//indexPath(NSIndexPath *):cell的索引值,-1為最后一個cell
//atPosition(UITableViewScrollPosition):指定cell移動到的位置,如TableView顯示的底部,中部,頂部
//搜索條件:AccessibilityIdentifier(邏輯約束)/UITableView(控件指針)
- (UITableViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier;
- (UITableViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier atPosition:(UITableViewScrollPosition)position;
- (UITableViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)tableView;
- (UITableViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)tableView atPosition:(UITableViewScrollPosition)position;
//編輯模式下,移動table cell
//TableView的cell
//參數(shù):
//sourceIndexPath:滑動的起始索引
//destinationIndexPath:滑動的終止索引
//搜索條件:AccessibilityIdentifier(邏輯約束)/UITableView(控件指針)
- (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier;
- (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath inTableView:(UITableView *)tableView;
//其他
//向某個方向拖拽指定cell
- (void)swipeRowAtIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)tableView inDirection:(KIFSwipeDirection)direction;
//等待指定cell出現(xiàn)刪除狀態(tài)
//cell(UITableViewCell*):cell對象指針
- (void)waitForDeleteStateForCell:(UITableViewCell*)cell;
- (void)waitForDeleteStateForCellAtIndexPath:(NSIndexPath*)indexPath inTableView:(UITableView*)tableView;
CollectionView
//與TableView的使用基本一致
- (void)tapItemAtIndexPath:(NSIndexPath *)indexPath inCollectionViewWithAccessibilityIdentifier:(NSString *)identifier;
- (void)tapItemAtIndexPath:(NSIndexPath *)indexPath inCollectionView:(UICollectionView *)collectionView;
- (UICollectionViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inCollectionView:(UICollectionView *)collectionView;
- (UICollectionViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inCollectionViewWithAccessibilityIdentifier:(NSString *)identifier;
UIPickerView
//選擇對應UIPickerView的單元
//參數(shù):
//title(NSString *):單元的標題
//component:UIPickerView對應的列
//searchOrder(KIFPickerSearchOrder):滑動UIPickerView單元的順序(4種,具體參考源碼)
- (void)selectPickerViewRowWithTitle:(NSString *)title;
- (void)selectPickerViewRowWithTitle:(NSString *)title inComponent:(NSInteger)component;
- (void)selectPickerViewRowWithTitle:(NSString *)title inComponent:(NSInteger)component withSearchOrder:(KIFPickerSearchOrder)searchOrder;
UIDatePicker
//與UIPickerView基本操作一致,具體可以參考源碼
- (void)selectDatePickerValue:(NSArray *)datePickerColumnValues;
- (void)selectDatePickerValue:(NSArray *)datePickerColumnValues withSearchOrder:(KIFPickerSearchOrder)searchOrder;
Switch
//開關控件
//參數(shù):
//switchIsOn:控制開還是關
//搜索參數(shù):AccessibilityLabel輔助功能標示/UIAccessibilityElement+ switchView
- (void)setOn:(BOOL)switchIsOn forSwitchWithAccessibilityLabel:(NSString *)label;
- (void)setSwitch:(UISwitch *)switchView element:(UIAccessibilityElement *)element On:(BOOL)switchIsOn;
Slider
//滑塊控件
//value:滑動程度
//搜索參數(shù):AccessibilityLabel輔助功能標示/UISlider 對象指針控件
- (void)setValue:(float)value forSliderWithAccessibilityLabel:(NSString *)label;
- (void)setValue:(float)value forSlider:(UISlider *)slider;
Stepper
- (void)tapStepperWithAccessibilityLabel:(NSString *)accessibilityLabel increment:(KIFStepperDirection)stepperDirection;
- (void)tapStepperWithAccessibilityElement:(UIAccessibilityElement *)element increment:(KIFStepperDirection)stepperDirection inView:(UIView *)view;
系統(tǒng)性操作
動畫相關
//等待動畫消失
//參數(shù):
//timeout(NSTimeInterval):等待超時時間
//stabilizationTime(NSTimeInterval):睡眠時間,一般睡眠時間內不會探測動畫是否結束
- (void)waitForAnimationsToFinish;
- (void)waitForAnimationsToFinishWithTimeout:(NSTimeInterval)timeout;
- (void)waitForAnimationsToFinishWithTimeout:(NSTimeInterval)timeout stabilizationTime:(NSTimeInterval)stabilizationTime;
鍵盤
//等待鍵盤出現(xiàn)
- (void)waitForSoftwareKeyboard;
//等待鍵盤出現(xiàn),且可輸入
- (void)waitForKeyInputReady;
//等待鍵盤消失
- (void)waitForAbsenceOfSoftwareKeyboard;
相冊
//選擇指定相冊的指定位置圖片
//參數(shù):
//albumName:相冊名
//row:行
//column:列
- (void)choosePhotoInAlbum:(NSString *)albumName atRow:(NSInteger)row column:(NSInteger)column;
第一響應
等待目標控件活動第一響應
- (void)waitForFirstResponderWithAccessibilityLabel:(NSString *)label;
- (void)waitForFirstResponderWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits;
通知/URL的監(jiān)聽
//監(jiān)聽某個對象接受的指定通知
//參數(shù):
//name:通知名稱
//object:監(jiān)聽的對象
//block:監(jiān)聽后需要執(zhí)行的代碼塊
- (NSNotification *)waitForNotificationName:(NSString*)name object:(id)object;
- (NSNotification *)waitForNotificationName:(NSString *)name object:(id)object whileExecutingBlock:(void(^)())block;
//監(jiān)聽指定的URL訪問
//基本原理是通過hock openURL來實現(xiàn)
//參數(shù)
//URLString:監(jiān)聽的目標url
//block:監(jiān)聽到后需要執(zhí)行的代碼塊
//returnValue:標記位,hock函數(shù)是否打開
- (void)waitForApplicationToOpenURL:(NSString *)URLString whileExecutingBlock:(void(^)())block returning:(BOOL)returnValue;
- (void)waitForApplicationToOpenAnyURLWhileExecutingBlock:(void(^)())block returning:(BOOL)returnValue;
//與上述函數(shù)一致,差異在于傳遞的URLScheme(通過配置可以在瀏覽器打開應用)
- (void)waitForApplicationToOpenURLWithScheme:(NSString *)URLScheme whileExecutingBlock:(void (^)())block returning:(BOOL)returnValue;
其他
//在屏幕上關閉一個popover的彈窗
- (void)dismissPopover;
//點擊status bar
- (void)tapStatusBar;
//模擬home鍵點擊
- (void)deactivateAppForDuration:(NSTimeInterval)duration
// 關閉系統(tǒng)彈窗,關閉成功返回ture,反之返回false
- (BOOL)acknowledgeSystemAlert;
//設置指定視圖的文案
- (void)setText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label;
//獲取指定視圖的文案
- (NSString *)textFromView:(UIView *)view;
//截屏
- (void)captureScreenshotWithDescription:(NSString *)description;
//模擬內存報警
- (void)simulateMemoryWarning;
//模擬橫豎屏切換
- (void)simulateDeviceRotationToOrientation:(UIDeviceOrientation)orientation;