Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

UIScrollViewによる拡大縮小

タグ: iPhone Objective-C

UIScrollView によって拡大縮小されたビューのスケールは、拡大縮小されたビュー自身に記録される。

- (void)applicationDidFinishLaunching:(UIApplication*)application
{
    UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:window.bounds];
    scrollView.delegate = self;

    // Earth.jpg は /Library/Desktop Pictures/Nature から拝借
    UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Earth.jpg"]];
    scrollView.contentSize = imageView.bounds.size;
    scrollView.minimumZoomScale = 0.25;
    scrollView.maximumZoomScale = 4.0;
    [scrollView addSubview:imageView];
    [imageView release];

    [window addSubview:scrollView];
    [window makeKeyAndVisible];

    [scrollView release];
}

- (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView
{
    UIView* view = [scrollView.subviews objectAtIndex:0];
    id gestureInfo = [view valueForKey:@"gestureInfo"];
    NSLog(
        @"will: %f %@ %@ %@",
        view.transform.a,
        [gestureInfo valueForKey:@"zoomScale"],
        [gestureInfo valueForKey:@"minScale"],
        [gestureInfo valueForKey:@"maxScale"]
    );
    return view;
}

- (void)scrollViewDidEndZooming:(UIScrollView*)scrollView withView:(UIView*)view atScale:(float)scale
{
    id gestureInfo = [view valueForKey:@"gestureInfo"];
    NSLog(
        @"did: %f %f %@ %@ %@",
        scale,
        view.transform.a,
        [gestureInfo valueForKey:@"zoomScale"],
        [gestureInfo valueForKey:@"minScale"],
        [gestureInfo valueForKey:@"maxScale"]
    );
}

以上のコードで作られたスクロールビューを、適当にピンチイン・アウトしてログを出力してみる。

will: 1.000000 1 0.35 1.6
did: 0.757831 0.757831 0.7578313 0.25 4
will: 0.757831 0.7578313 0.25 4
did: 1.281839 1.281839 1.281839 0.25 4
will: 1.281839 1.281839 0.25 4
did: 0.250000 0.250000 0.25 0.25 4

viewForZoomingInScrollView: が呼ばれる前に UIView::transform をいじっても、初回呼び出し時はスケール1から、それ以降は(おそらく) zoomScale の値から拡大縮小が始まる。
このスケール値を直接操作するAPIは公開されていない。
そのため、 viewForZoomingInScrollView: の戻り値となるビューのスケール操作は、全て UIScrollView に任せるのが基本となる。
しかし、 UIScrollView には「ダブルタップによるズームイン・アウト」は実装されていない。
Photos等に見られるそのような操作を実現するには、何かしら小細工が必要になる。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/154-4d727e4f
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。