1

VoiceOver で簡単なアプリにアクセスできるようにしようとしています。

このアプリは、不透明なビューを持つビュー コントローラーを読み込み、このビュー上の 1 本の指の位置を追跡します。ただし、「(void)accessibilityElementDidBecomeFocused」メソッドが呼び出された後でも、ビューに(タップして)再度フォーカスする必要がある理由がわかりません。ビューの '(void) accessibilityElementDidLoseFocus' も呼び出されないため、混乱しています。

SO および Apple docs からの View Controller 封じ込めの指示に正しく従っていると思います。

1 - http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW81

2 - View Controller Containment は iOS 5 でどのように機能しますか?

新しいView Controllerを表示するコードは次のとおりです。

CGRect frame = self.view.bounds;
customViewController = [[FocusIssueCustomViewController alloc] init];
[customViewController loadWithFrame:frame forViewController:self withAlpha:0.5];

// setting properties of the custom view:
[customViewController.view setAccessibilityLabel:@"Touch area"];
[customViewController.view setMultipleTouchEnabled:YES];
[customViewController.view setIsAccessibilityElement:YES];
[customViewController.view setAccessibilityTraits:UIAccessibilityTraitAllowsDirectInteraction];

// inform user the screen has changed:
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, customViewController.view);

loadWithFrame メソッドは次のとおりです。

- (void) loadWithFrame: (CGRect) frame forViewController: (UIViewController*) viewController withAlpha: (float) alphaValue
{
// keep a reference to the view controller that requested the Custom View
[self setOriginatingViewController:viewController];

// load the custom view
[self setCustomView:[[FocusIssueCustomView alloc] initWithFrame:frame]];
[self customView].alpha = alphaValue;

// make this the ViewController for this view
self.view = [self customView];

// add the view controller following guidelines from the
// viewController containment in the UIViewController class reference from the Apple docs
[self.originatingViewController addChildViewController:self];
[self.originatingViewController.view addSubview:self.view];
[self didMoveToParentViewController:self.originatingViewController];
}

このカスタム ビューは、ワンタッチを追跡します。実装ファイルは以下のとおりです。

#import "FocusIssueCustomView.h"
#define CIRCLE_DIAMETER 110

@interface FocusIssueCustomView ()
{
    // coordinate of this one touch
    float xCood, yCood;
}
@end

@implementation FocusIssueCustomView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
return self;
}

 // Only override drawRect: if you perform custom drawing.
 // An empty implementation adversely affects performance during animation.
 - (void)drawRect:(CGRect)rect
 {

 // make the custom view opaque
 CGContextRef ctx = UIGraphicsGetCurrentContext();
 CGFloat black[] = {0, 0, 0, 1.0};
 CGContextSetFillColor(ctx, black);
 CGContextAddRect(ctx, rect);
 CGContextFillPath(ctx);
 [self setAlpha:0.5];

 // clear current context
 CGContextRef CurrentContext = UIGraphicsGetCurrentContext();
 CGContextClearRect(CurrentContext, rect);

 // draw a blue circle, no fill for the touch
 CGContextRef context = UIGraphicsGetCurrentContext();
 CGContextSetLineWidth(context, 4.0);
 CGContextSetRGBStrokeColor(context, 0, 0, 255, 1);
 CGRect rectangle = CGRectMake(xCood - CIRCLE_DIAMETER/2, yCood - CIRCLE_DIAMETER/2, CIRCLE_DIAMETER, CIRCLE_DIAMETER);
 CGContextAddEllipseInRect(context, rectangle);
 CGContextStrokePath(context);
 }

- (void) accessibilityElementDidBecomeFocused
{
    NSLog(@"Inside the custom view's \"accessibilityElementDidBecomeFocused\" method");
}

- (void) accessibilityElementDidLoseFocus
{
    NSLog(@"Inside the custom view's \"accessibilityElementDidLoseFocus\" method");
}

#pragma mark - touch method
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    // if 1 touch on screen, track this touch
    if ([[event allTouches] count] == 1)
    {
        CGPoint point = [[touches anyObject] locationInView:self];
        xCood = point.x;
        yCood = point.y;
        NSLog(@"Touch at (%f, %f)", xCood, yCood);        
    }

    // redraw
    [self setNeedsDisplay];
}
@end

この透明な CustomView を制御するには、ビュー コントローラーが本当に必要です (したがって、ビュー コントローラーのコンテインメント アプローチ)。そのため、単純に「addSubview」アプローチを採用しているわけではありません。どんな助けでも大歓迎です..

ありがとう -

VP

4

0 に答える 0