添加自定义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上分支了我的应用,并在scrollView
和scrollView
(这里是全屏 )之间插入了一个contentView
:
缩放图像和瓷砖的作品,但我不能滚动了。
我已经打印出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将会显示出来