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

标签 ios iphone objective-c uiview uiscrollview

作为 iOS 新手,我正在尝试开发 a (yet another) word game .

我有一个 UIScrollView,其中包含一个带有棋盘图像的 UIImageView

UIScrollView 可以通过双击和双指缩放来缩放:

app screenshot

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

Tile.m 中的实现使用 touchesBegantouchesMoved 处理拖动并在 touchesEnded 中发布通知。

单 View Controller ViewController.m观察此通知并通过以下代码向 UIScrollView 添加/从 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:当我将字母 block 添加到 ScrollView 时,如何计算字母 block 的位置和大小?

iOS 是否为此目的提供了任何方便的函数,或者我是否必须手动计算这些值(如我上面的代码所示)?

问题 2: 当我缩放 ImageView (游戏板)时,放置在其上的字母不会缩放。大概是因为这个方法吧?

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

如何解决这个问题?上面的方法无法返回几个对象

更新:

我有branched my app on GitHub并在 scrollViewimageView 之间插入一个 contentView(此处为 fullscreen):

Xcode screenshot

然后可以缩放图像和图 block ,但我不能再滚动了。

我已经打印出 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

最佳答案

对于问题1:

UIScrollView 有两个属性

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

对于第二个问题,我建议在拖动时缩放 letterImage,当它被放置在板上时,使用原始大小 ScrollView 将显示它很好

关于ios - 将自定义 UIView 添加到 UIScrollview - 如何计算位置、大小和处理缩放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22310311/

相关文章:

ios - 为 UITableView 的每一行推送不同的 UIView

ios - 从 swift 的子类函数导航到 viewcontroller

ios - 如何制作uiimageview圆。?

ios - 我想为按钮和下面的方法编写一个OCMock单元测试。我该怎么写?

ios - 有什么方法可以在 iOS 本地保存 Red5 发布的视频吗?

android - 如何将 Tensorflow 与 react-native 一起使用?

ios - 删除 iOS 版本而不上传构建

ios - NSBundles 中的类

ios - 使用 NSValue 包装一个 C 指针

objective-c - ViewDidLoad/Unload 消息到 super ?