触摸时自定义UIViews的奇怪行为

时间:2014-03-09 16:40:48

标签: ios iphone uiview uiscrollview touchesmoved

a (yet another) word game for iOS的内容中,我有一个滚动视图,其中包含游戏板的图像视图。

下面我有可拖动的自定义视图,代表字母图块。

对于滚动视图,我添加了一个双击手势识别器,用于切换其zoomScale(图像宽度在50%和100%之间):

app screenshot

这很有效,但我必须禁用Autolayout(因为滚动视图的contentOffset会在拖动切片时跳转到{0,0}

所以我必须将以下代码添加到ViewController.m以在设备旋转后调整滚动视图的框架:

- (void) adjustSubViews
{
    _scrollView.frame = CGRectMake(0,
                                   0,
                                   self.view.bounds.size.width,
                                   self.view.bounds.size.height - kHeight - 2 * kPadding);
}

这似乎也有效 - 但我的问题是在第一次设备旋转到横向和后退“有什么破坏”和通过触摸下方的瓷砖突然可以拖动

app screenshot

为什么会这样?

以下是显示滚动视图属性的Xcode屏幕截图(此处为fullscreen):

Xcode screenshot

更新:我已将尺寸记录添加到Tile.m

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    NSLog(@"%s %@", __PRETTY_FUNCTION__, NSStringFromCGSize(self.frame.size));

    [_smallImage setHidden:YES];
    [_smallLetter setHidden:YES];
    [_smallValue setHidden:YES];

    [_bigImage setHidden:NO];
    [_bigLetter setHidden:NO];
    [_bigValue setHidden:NO];

    [self.superview bringSubviewToFront:self];
}

并且最初记录的预期图块大小为45x45(由我在Tile.xib中设置):

-[Tile touchesBegan:withEvent:] {45, 45}

将设备旋转到横向并回到纵向后,我突然得到160的高度:

-[Tile touchesBegan:withEvent:] {45, 160}

1 个答案:

答案 0 :(得分:2)

图块变得可拖动其图像因为包含图块的视图由其在旋转期间更改其框架的超级视图(控制器视图)自动调整大小。

enter image description here

通过将平铺视图的自动调整掩码设置为UIViewAutoresizingNone(通过取消选择Interface Builder中的所有弹簧和支柱),可以轻松避免此行为。

enter image description here

请注意调试视图大小调整问题的工具,如下所示:

  1. LLDB命令po viewVariableOrAddress(调用其参数的description方法并打印结果)。
  2. -[UIView recursiveDescription]通过以下命令从LLDB调用:po [viewVariableOrAddress recursiveDescription]。请注意,他的方法是私有的,不得在生产代码中调用(否则将拒绝该应用程序)。
  3. Reveal - 在自然的GUI中,表示在调试器控制台中可以在运行时获得的相同信息。