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

作为一个iOS新手,我正在尝试开发一个(又一个)文字游戏 。

我有一个UIScrollView控股UIImageView板图像。

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

应用截图

UIScrollView下面,我有7个可拖动的UIView表示字母。

Tile.m中的实现通过touchesBegan处理拖动, touchesMoved并在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]; } } 

这种作品,但我有2个问题 –

应用截图

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

有没有为此目的,由iOS提供的任何舒适的function,还是我必须手动计算这些值(如上面的代码所示)?

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

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

如何解决这个问题? 上述方法不能返回多个对象

更新:

我已经在GitHub上分支了我的应用,并在scrollViewscrollView (这里是全屏 )之间插入了一个contentView

Xcode截图

缩放图像和瓷砖的作品,但我不能滚动了。

我已经打印出contentSize ,它似乎与1000×1000没关系:

 -[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

另外我已经尝试更改界面生成器中的UIImageView的交互checkbox,但它没有帮助。

我无法通过使用显示应用程序(这里全屏 )找出问题:

显示应用程序

问题2:使用新的内容视图作为超级视图的棋盘和棋子。 这样棋盘坐标中棋子的位置和大小将独立于应用于contentView的缩放和平移。

问题1:不再有问题1!

对于问题1:

UIScrollView有两个属性

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

而对于第二个问题,我build议在拖动的时候缩放letterImage,并且在放置到原始大小的情况下使用scrollview将会显示出来