Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 触摸自定义UIView时的奇怪行为_Ios_Iphone_Uiview_Uiscrollview_Touchesmoved - Fatal编程技术网

Ios 触摸自定义UIView时的奇怪行为

Ios 触摸自定义UIView时的奇怪行为,ios,iphone,uiview,uiscrollview,touchesmoved,Ios,Iphone,Uiview,Uiscrollview,Touchesmoved,在一个什么是我有一个滚动视图持有一个游戏板的图像视图 在下面,我有一个可拖动的自定义视图,表示字母瓦片 对于滚动视图,我添加了一个双击手势识别器,用于切换其zoomScale(图像宽度介于50%和100%之间): 这很好,但我必须禁用自动布局(因为否则,当我拖动平铺时,滚动视图的contentOffset将跳转到{0,0}) 因此,我必须添加以下代码,以便在设备旋转后调整scroll view的帧: - (void) adjustSubViews { _scrollView.frame

在一个什么是我有一个滚动视图持有一个游戏板的图像视图

在下面,我有一个可拖动的自定义视图,表示字母瓦片

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

这很好,但我必须禁用自动布局(因为否则,当我拖动平铺时,滚动视图的
contentOffset
将跳转到
{0,0}

因此,我必须添加以下代码,以便在设备旋转后调整scroll view的帧:

- (void) adjustSubViews
{
    _scrollView.frame = CGRectMake(0,
                                   0,
                                   self.view.bounds.size.width,
                                   self.view.bounds.size.height - kHeight - 2 * kPadding);
}
这似乎也能起作用-但我的问题是,在第一次设备旋转到横向和反向后,“有东西断了”并且瓷砖突然会因触摸下方而被拖走

为什么会这样

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

更新:我已将大小记录添加到:

最初它记录的预期磁贴大小为45x45(由我在
tile.xib
中设置):

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

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

由于包含平铺的视图在旋转过程中更改其帧的superview(控制器视图)会自动调整其大小,因此平铺可以拖动其图像

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

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

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

  • 我会将您对
    adjustSubview
    adjustZoom
    的调用从
    viewDidLoad
    didRotateFromInterfaceOrientation:
    中移出,然后将它们都放在
    ViewWillLayoutSubview
    中-这将在设备旋转和
    viewDidLoad
    之后调用。您可能也希望在此处更新
    平铺
    对象的帧,而不是在
    viewDidLoad
    中设置这些帧。我不确定这是否能解决您的问题,但它可能有助于隔离问题。我还没有阅读GitHub上的代码。如何移动瓷砖?使用
    触摸移动
    :谢谢,我错误地认为禁用自动布局也禁用了自动调整大小。。。请看一下我的另一个(慷慨的)问题:
    
    -[Tile touchesBegan:withEvent:] {45, 45}
    
    -[Tile touchesBegan:withEvent:] {45, 160}