Entries

スポンサーサイト

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

タイルビューの挙動確認用サンプル

タグ: iPhone Objective-C Quartz

layerClassがCATiledLayerなUIView継承クラスの挙動確認を目的に作成したクラス。
タイルごとにそのタイルの担当範囲やら拡大率やらを描画する。

@interface TiledView : UIView<UIScrollViewDelegate>
@property (nonatomic, readonly) CATiledLayer *tiledLayer;
@end

@implementation TiledView
/// @name TiledView
//@{
- (CATiledLayer *)tiledLayer
{
    return (CATiledLayer *)self.layer;
}
//@}
/// @name UIView オーバーライド
//@{
+ (Class)layerClass
{
    return [CATiledLayer class];
}
- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGAffineTransform t = CGContextGetCTM(context);
    
    int xmin = CGRectGetMinX(rect);
    int ymin = CGRectGetMinY(rect);
    int xmax = CGRectGetMaxX(rect);
    int ymax = CGRectGetMaxY(rect);
    int x = xmin / CGRectGetWidth(rect);
    int y = ymin / CGRectGetHeight(rect);
    NSString *string =
        [NSString stringWithFormat:
            @"%gx [%d,%d]\n(%d,%d)-(%d,%d)",
            t.a, x, y, xmin, ymin, xmax, ymax
        ];
    [[UIColor whiteColor] set];
    [string drawInRect:rect withFont:[UIFont systemFontOfSize:(20 / t.a)]];
}
//@}
/// @name UIScrollViewDelegate 実装
//@{
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
    [self setNeedsDisplay];
    return NO;
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self;
}
//@}
@end

このようにUIScrollViewのサブビュー兼デリゲートオブジェクトとして使う。

- (void)applicationDidFinishLaunching:(UIApplication *)application
{ 
    TiledView* tiledView = [[TiledView alloc] initWithFrame:CGRectMake(0, 0, 4096, 4096)];
    tiledView.tiledLayer.levelsOfDetail = 5; // 全「5」階層
    tiledView.tiledLayer.levelsOfDetailBias = 3; // 拡大方向へは「2x」「4x」「8x」の「3」階層
     
    UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:window.frame];
    scrollView.contentSize = tiledView.bounds.size;
    scrollView.maximumZoomScale = 16;
    scrollView.minimumZoomScale = 0.25;
    scrollView.delegate = tiledView;
    [scrollView addSubview:tiledView];
    [tiledView release];
    
    [window addSubview:scrollView];
    [scrollView release];
    
    [window makeKeyAndVisible];
}

いろいろ設定をいじりながら使ってみたところ、iPhone実機(2.2.1)では綺麗に表示されるのに、シミュレータでは大きい倍率で描画が乱れることがある。

tiled_layerrrr.png

なぜか描画されないタイルができることも。

blank_tile.png

また実機・シミュレータともに、frame.sizeとlevelsOfDetailBiasがかなり大きいTiledViewに対してsetNeedsDisplayを送る(ステータスバーをタップする)とSpringBoardプロセスがしばらく処理を占有してしまい、操作を一切受け付けなくなる。
こうなると処理が終わるまでSpringBoardに戻ることもできなくなるので非常に鬱陶しい。

スポンサーサイト

コメント

コメントの投稿

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

トラックバック

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

Appendix

タグ

Blog内検索

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