頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


UIScrollViewのサブビューを拡大した後におかしくなる

UIScrollViewを使えばビューを拡大させたりするのが簡単に実装できるよね。
こんな感じでscrollViewに拡大させることができるsubViewをのせることにする。
{
    //set scrollView
    UIScrollView *scrollView = [[[UIScrollView alloc] initWithFrame:(CGRect){0,0,320,320}] autorelease];
    scrollView.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    scrollView.delegate = self;
    scrollView.maximumZoomScale = 10.0f;
    scrollView.contentSize = (CGSize){3000 , 3000};
    [self.view addSubview:scrollView];
    
    //set sub view
    UIImage *image = [UIImage imageNamed:@"image.png"];
    subView = [[[UIImageView alloc] initWithImage:image] autorelease];
    subView.frame = (CGRect){10,10,300,300};
    [scrollView addSubview:subView];

    //check scrollView.contentSize
    NSLog(@"contentSize.width=%.1f , contentSize.height=%.1f", scrollView.contentSize.width , scrollView.contentSize.height);
}

//UIScrollViewDelegate Protocol method
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return subView;
}
↓最初はこんなのが
UIScrollViewテスト
↓移動したり
UIScrollView移動
↓拡大できるようになる。
UIScrollView拡大
たいしたコードじゃないのにあれだけでピンチで拡大とかできるんだからスゴいよね。

問題はこの後に縮小して最初の大きさにしたら、移動できなくなるんだ(iOS 6.1.3)。
あと、拡大時に画像の端っこが表示されずにすーっと戻ってしまうとかね。

なんでだ?と思って確認すると、画像を拡大した時にscrollView.contentSizeが書き換えられてるみたいなんだよ。
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
    NSLog(@"scale=%f , contentSize.width=%.1f , contentSize.height=%.1f",scale , scrollView.contentSize.width , scrollView.contentSize.height);
}
↑これもUIScrollViewDelegate Protocolのメソッドで拡大や縮小が終わった時点でコールされる。
ここでチェックしてみると、、、

scrollView.contentSizeのチェック
↑書き換えられてて、最初の値と違ってる。値をみると、どうやら拡大すると scale x 元のサイズ でcontentSizeが上書きされてるみたい。

結局このメソッド内で自分が設定したい値に設定し直すことで意図通りにすることができたよ。

<< UIBarButtonItemからUIButtonは取得できる?   TopPage  ZipArchiveでうまくビルドできなかった原因 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/795-2713f6aa




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad