2015-06-23 21 views
1

任何人都可以清楚地解釋一下UIAccessibilityConvertFrameToScreenCoordinates期望它的第二個參數的UIView嗎?有時它的行爲與我所期望的一樣,將VoiceOver的焦點矩形繪製在適當的元素上,但其他時候使用此輔助函數看起來就像巫術一樣!您應該使用UIAccessibilityConvertFrameToScreenCoordinates的哪個視圖?

Apple的文檔似乎沒有解釋。它指出參數必須是包含CGRect的視圖,但在某些實現中,不清楚哪個視圖是CG的當前上下文。有沒有簡單的方法來解決這個問題?

作爲一個例子,我創建了一個自定義的UITableViewCell,它通過覆蓋單元格的UIAccessibilityContainer實現(見下文)具有自定義的VoiceOver焦點順序。無論我嘗試什麼,accessibilityFrame都會關閉。我試着發送一個對關聯的UITableView的引用,包含該接口的父UIView以及窗口本身。我覺得我已經瀏覽了整個視圖堆棧!

下面是不是自定義UITableViewCell類的完整代碼,但應該讓你知道我正在嘗試做什麼。

#pragma mark - Accessibility (UIAccessibilityContainer implementation) 

- (id)accessibilityElementAtIndex:(NSInteger)index 
{ 
    return [self.accessibilityObjects objectAtIndex:index]; 
} 

- (NSInteger)accessibilityElementCount 
{ 
    return self.accessibilityObjects.count; 
} 

- (NSInteger)indexOfAccessibilityElement:(id)element 
{ 
    return [self.accessibilityObjects indexOfObject:element]; 
} 

- (void *)addAccessibilityElement:(UIView *)accessibleView{ 
    if (self.accessibilityObjects == nil) { 
     self.accessibilityObjects = [NSMutableArray array]; 
    } 

    UIAccessibilityElement *accessibilityElement = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self]; 
    accessibilityElement.accessibilityLabel = accessibleView.accessibilityLabel; 
    //accessibilityElement.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(accessibleView.frame, self.contentView); 
    //accessibilityElement.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(accessibleView.frame, self.parentView); // parentView is a reference to the view controller's parent view 
    accessibilityElement.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(accessibleView.frame, self.tableView); // tableView is a reference to the cell's UITableView 

    [self.accessibilityObjects addObject:accessibilityElement]; 
} 

我希望這對某人有意義。提前致謝。

回答

2

讓我們看看從文檔這一功能的目的:

Converts the specified rectangle from view coordinates to screen coordinates. 

所以,你通過這個功能視圖的矩形,其父視圖中,然後本身的父視圖。根據這些信息,您將得到一個輸出,即視圖的屏幕座標。所以,答案就是矩形的擁有視圖,從中計算出相對矩形。這通常是它的層次直接父視圖,但可能會更高的視圖層次結構。

例如,如果您的矩形爲{0,0,view.width,view.height},並且您將視圖傳遞給此參數,則輸出將與您傳入的矩形相同,調整其在屏幕上的位置的初始x和y座標。

+0

謝謝,克里斯。我將再次使用這些信息進行處理。 – dotjay

0

想通了,忘了發帖。這個關鍵似乎是覆蓋視圖的accessibilityFrame方法,因爲VoiceOver可能需要輪詢視圖以獲取幀信息。所以,你不能只設置一次accessibilityFrame,就好像它是視圖的屬性一樣。

+0

經過幾次測試後回到這裏,看起來我是對的。輔助屬性通常是靜態的 - 按鈕特徵,靜態文本/ accessibilityLabel屬性等。由於組件的可見輔助框架比其他輔助功能屬性更可能發生變化 - 考慮方向更改,佈局更改等 - 必須重寫accessibilityFrame方法在預期行爲的視圖中,因爲這是VoiceOver將調用以獲取適當的屏幕座標以繪製其可訪問性框架的方法。 – dotjay