将自定义UIView添加到UIScrollview - 如何计算位置,大小和处理缩放?

时间:2014-03-10 20:12:46

标签: ios iphone objective-c uiview uiscrollview

作为iOS新手,我正在努力开发a (yet another) word game

我有UIScrollView持有UIImageView的电路板图片。

UIScrollView可以通过双击和捏合手势进行缩放:

app screenshot

UIScrollView下方,我有7个可拖动的UIView代表字母图块。

Tile.m中的实施处理拖拽touchesBegantouchesMoved并在touchesEnded中发布通知。

单个视图控制器ViewController.m会观察此通知,并通过以下代码向/ UIScrollView添加/删除磁贴:

- (void) handleTileMoved:(NSNotification*)notification {
    Tile* tile = (Tile*)notification.object;

    if (tile.superview != _scrollView && 
        CGRectIntersectsRect(tile.frame, _scrollView.frame)) {

        [tile removeFromSuperview];
        [_scrollView addSubview:tile];
        tile.frame = CGRectMake(tile.frame.origin.x + _scrollView.contentOffset.x,
                                tile.frame.origin.y + _scrollView.contentOffset.y,
                                kTileWidth * _scrollView.zoomScale,
                                kTileScale * _scrollView.zoomScale);

    } else if (tile.superview == _scrollView &&
               !CGRectIntersectsRect(tile.frame, _scrollView.frame)) {

        [tile removeFromSuperview];
        [self.view addSubview:tile];
        [self adjustFrames];
    }
}

这种作品,但我有两个问题 -

app screenshot

问题1:当我将其添加到滚动视图时,如何计算字母图块的位置和大小?

iOS是否为此提供了舒适的功能,还是我必须手动计算这些值(如上面的代码所示)?

问题2:当我缩放图像视图(游戏板)时,放在其上的字母片段不会缩放。可能是因为这种方法?

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

如何解决这个问题?我不能通过上面的方法返回几个对象

更新

我有branched my app on GitHub并在contentViewscrollView之间插入imageView(此处为fullscreen):

Xcode screenshot

缩放图像,然后瓷砖工作,但我不能再滚动了。

我已打印出contentSize,似乎可以使用1000x1000:

-[ViewController viewDidLoad]: image {1000, 1000}
-[ViewController viewDidLayoutSubviews] contentOffset={0, 0} contentSize={1000, 1000}
tile: N 9 {2, 433} {45, 45}
tile: V 1 {47, 433} {45, 45}
tile: L 9 {92, 433} {45, 45}
tile: R 4 {137, 433} {45, 45}
tile: B 7 {182, 433} {45, 45}
tile: B 8 {227, 433} {45, 45}
tile: M 5 {272, 433} {45, 45}
-[ViewController adjustZoom]: scrollView origin={0, 0} size={320, 431} minScale=0.320000 zoomScale=0.640000 maxScale=0.640000
-[ViewController adjustZoom]: imageView origin={0, 0} size={1000, 1000}
-[ViewController adjustZoom]: contentView origin={0, 0} size={640, 640}

我尝试更改_scrollView.canCancelContentTouches_scrollView.translatesAutoresizingMaskIntoConstraints

此外,我已尝试更改Interface Builder中UIImageView的交互性复选框,但它没有帮助。

我无法通过使用Reveal应用程序来解决问题(这里fullscreen):

Reveal app

2 个答案:

答案 0 :(得分:2)

问题1:

有两个属性UIScrollView

 UIScrollView* sc = [[UIScrollView alloc] init];
 CGPoint pt = sc.contentOffset;
 CGFloat scale = sc.zoomScale;

对于第二个问题,我建议在拖动的同时缩放letterImage,当放置在板上时,原始尺寸的scrollview会显示它很好

答案 1 :(得分:1)

问题2:使用新的contentView作为主板和棋子的超级视图。这样,棋盘坐标中棋子的位置和大小将与应用于contentView的缩放和平移无关。

问题1:不再存在问题1!