UIScrollView setZoomScale将应用的旋转设置回零

时间:2012-08-17 12:49:03

标签: ios uiscrollview rotation calayer zooming

我现在一直在替换地图。整个过程适用于由UIScrollView支持的CATiledLayer

要旋转地图,我会自动旋转图层。 (使用CATransform3DMakeRotation)到目前为止工作得非常好=)

但如果我调用setZoomScale方法,那么将要提交给我的图层的CATransform3D会将轮换重置为0.

我的问题是,有没有办法在不丢失应用轮换的情况下设置我的scrollView的zoomscale

捏合手势存在同样的问题。

//其他信息

要围绕当前位置旋转,我必须编辑锚点。也许这也是缩放的问题。

- (void)correctLayerPosition {
    CGPoint position    = rootView.layer.position;
    CGPoint anchorPoint = rootView.layer.anchorPoint;
    CGRect  bounds      = rootView.bounds;
    // 0.5, 0.5 is the default anchorPoint; calculate the difference
    // and multiply by the bounds of the view
    position.x              = (0.5 * bounds.size.width) + (anchorPoint.x - 0.5) *    bounds.size.width;
    position.y              = (0.5 * bounds.size.height) + (anchorPoint.y - 0.5) * bounds.size.height;
    rootView.layer.position = position;
}

- (void)onFinishedUpdateLocation:(CLLocation *)newLocation {
    if (stayOnCurrentLocation) {
        [self scrollToCurrentPosition];
    }
    if (rotationEnabled) {
        CGPoint anchorPoint        = [currentConfig layerPointForLocation:newLocation];
        anchorPoint.x              = anchorPoint.x / rootView.bounds.size.width;
        anchorPoint.y              = anchorPoint.y / rootView.bounds.size.height;
        rootView.layer.anchorPoint = anchorPoint;
        [self correctLayerPosition];
    }
}

1 个答案:

答案 0 :(得分:7)

您可以实现scrollViewDidZoom:委托方法并连接两个转换以达到预期效果:

- (void) scrollViewDidZoom:(UIScrollView *) scrollView
{
    CATransform3D scale = contentView.layer.transform;
    CATransform3D rotation = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);

    contentView.layer.transform = CATransform3DConcat(rotation, scale);
}

修改

我有更简单的想法!如何在附加了旋转变换的情况下向层次结构中添加另一个视图?这是建议的层次结构:

  • 滚动型
    • ContentView - viewForZoomingInScrollView:返回的内容
      • RotationView - 具有旋转变换的旋转视图
        • MapView - 包含所有图块的

我不认为这里的表现应该引起任何关注,值得一试。