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中取消选择所有弹簧和支柱),可以轻松避免此行为
请注意用于调试视图大小调整问题的工具,如下所示:
po viewVariableOrAddress
(调用其参数的description
方法并打印结果)po[viewVariableOrAddressRecursiveDescription]
。请注意,他的方法是私有的,不能在生产代码中调用(否则将拒绝该应用程序)我会将您对
adjustSubview
和adjustZoom
的调用从viewDidLoad
和didRotateFromInterfaceOrientation:
中移出,然后将它们都放在ViewWillLayoutSubview
中-这将在设备旋转和viewDidLoad
之后调用。您可能也希望在此处更新平铺
对象的帧,而不是在viewDidLoad
中设置这些帧。我不确定这是否能解决您的问题,但它可能有助于隔离问题。我还没有阅读GitHub上的代码。如何移动瓷砖?使用触摸移动:谢谢,我错误地认为禁用自动布局也禁用了自动调整大小。。。请看一下我的另一个(慷慨的)问题:
-[Tile touchesBegan:withEvent:] {45, 45}
-[Tile touchesBegan:withEvent:] {45, 160}