2013-05-07 70 views
2

如何使CALayer可訪問?具體來說,我希望圖層能夠隨時更改其標籤,因爲它可以隨時更改。官方文檔的sample code並沒有真正考慮到這一點。CALayer的動態可訪問性標籤

+0

有一個類似的帖子在這裏:http://stackoverflow.com/q/13254122/1804403但它明確拒絕UIAccessibilityContainer – Skotch 2013-05-07 21:19:13

回答

4

以下內容假定您有一個超級視圖,其圖層全部爲AccessableLayer,但如果您有更復雜的佈局,則可以修改此方案以處理該方案。

爲了使CALayer可訪問,您需要一個實現UIAccessibilityContainer方法的父視圖。這是一個建議的方式來做到這一點。

首先,有每一層自己的UIAccessibilityElement

@interface AccessableLayer : CALayer 
@property (nonatomic) UIAccessibilityElement *accessibilityElement; 
@end 
現在

在其實施,修改元素,只要稍有改變:

@implementation AccessableLayer 

... self.accessibilityElement.accessibilityLabel = text; 

@end 

的AccessableLayer從未創建UIAccessibilityElement,因爲構造要求一個UIAccessibilityContainer。因此,有超級視圖中創建並分配給它:

#pragma mark - accessibility 

// The container itself is not accessible, so return NO 
- (BOOL)isAccessibilityElement 
{ 
    return NO; 
} 

// The following methods are implementations of UIAccessibilityContainer protocol methods. 
- (NSInteger)accessibilityElementCount 
{ 
    return [self.layer.sublayers count]; 
} 

- (id)accessibilityElementAtIndex:(NSInteger)index 
{ 
    AccessableLayer *panel = [self.layer.sublayers objectAtIndex:index]; 
    UIAccessibilityElement *element = panel.accessibilityElement; 
    if (element == nil) { 
     element = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self]; 
     element.accessibilityFrame = [self convertRect:panel.frame toView:[UIApplication sharedApplication].keyWindow]; 
     element.accessibilityTraits = UIAccessibilityTraitButton; 
     element.accessibilityHint = @"some hint"; 
     element.accessibilityLabel = @"some text"; 
     panel.accessibilityElement = element; 
    } 
    return element; 
} 

- (NSInteger)indexOfAccessibilityElement:(id)element 
{ 
    int numElements = [self accessibilityElementCount]; 
    for (int i = 0; i < numElements; i++) { 
     if (element == [self accessibilityElementAtIndex:i]) { 
      return i; 
     } 
    } 
    return NSNotFound; 
} 
+0

您已經定義了' - (ID) accessibilityElementAtIndex:(NSInteger)index'在這段代碼中兩次 – 2015-02-13 12:55:45

+0

謝謝,@CarlosP,現在已經更正了。 – Skotch 2015-02-14 19:18:19