11

私はUIScrollViewを持っています。これには、負の原点を持つフレームを持つ UIView があります。ビュー全体をスクロールできないように、スクロール ビューを制限する必要があります。

このスクロールビューに Zoom を実装しました。

スクロール ビューをズームすると、スケールに応じてズーム可能なビューのサイズが調整されます。ただし、原点は調整しません。

したがって、フレームが{0, -500}, {1000, 1000}のビューがある場合

0.5 のスケールにズームアウトすると、{0, -500}, {500, 500}の新しいフレームが得られます

明らかにこれは良くありません。ビュー全体がスクロールビューからズームアウトされています。フレームを{0, -250}, {500, 500}にしたい

原点を正しく調整することで、scrollViewDidZoom メソッドで問題を少し修正できます。これは機能しますが、ズームはスムーズではありません。ここで原点を変更すると、ジャンプします。

UIView のドキュメントに次のように書かれていることに気付きました (frame プロパティに関して):

警告: transform プロパティが恒等変換でない場合、このプロパティの値は定義されていないため、無視する必要があります。

それがなぜなのかよくわかりません。

私はこの問題に間違ってアプローチしていますか? それを修正する最良の方法は何ですか?

ありがとう


以下は、私が使用しているテストアプリのソースコードです。

ビューコントローラーで..

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.bigView = [[BigView alloc] initWithFrame: CGRectMake(0, -400, 1000, 1000)];

    [self.bigScroll addSubview: bigView];
    self.bigScroll.delegate = self;
    self.bigScroll.minimumZoomScale = 0.2;
    self.bigScroll.maximumZoomScale = 5;
    self.bigScroll.contentSize = bigView.bounds.size;
}

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView  {
    return bigView;
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {    
//    bigView.frame = CGRectMake(0, -400 * scrollView.zoomScale,
//                               bigView.frame.size.width, bigView.frame.size.height);

    bigView.center = CGPointMake(500 * scrollView.zoomScale, 100 * scrollView.zoomScale);
}

そして、ビューで...

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(ctx, [UIColor whiteColor].CGColor);
    CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor);
    CGContextFillRect(ctx, CGRectMake(100, 500, 10, 10));

    for (int i = 0; i < 1000; i += 100) {
        CGContextStrokeRect(ctx, CGRectMake(0, i, 1000, 3));        
    }
}

ここでは、ズーム スケールが大きいほど、ジャンプがより顕著になることに注意してください。私の実際のアプリでは、はるかに多くの描画と処理がジャンプで行われていることが常に明らかです。

4

1 に答える 1