VoiceOver で簡単なアプリにアクセスできるようにしようとしています。
このアプリは、不透明なビューを持つビュー コントローラーを読み込み、このビュー上の 1 本の指の位置を追跡します。ただし、「(void)accessibilityElementDidBecomeFocused」メソッドが呼び出された後でも、ビューに(タップして)再度フォーカスする必要がある理由がわかりません。ビューの '(void) accessibilityElementDidLoseFocus' も呼び出されないため、混乱しています。
SO および Apple docs からの View Controller 封じ込めの指示に正しく従っていると思います。
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