在a (yet another) word game for iOS的内容中,我有一个滚动视图,其中包含游戏板的图像视图。
下面我有可拖动的自定义视图,代表字母图块。
对于滚动视图,我添加了一个双击手势识别器,用于切换其zoomScale
(图像宽度在50%和100%之间):
这很有效,但我必须禁用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);
}
这似乎也有效 - 但我的问题是在第一次设备旋转到横向和后退“有什么破坏”和通过触摸下方的瓷砖突然可以拖动 :
为什么会这样?
以下是显示滚动视图属性的Xcode屏幕截图(此处为fullscreen):
更新:我已将尺寸记录添加到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}
答案 0 :(得分:2)
图块变得可拖动其图像因为包含图块的视图由其在旋转期间更改其框架的超级视图(控制器视图)自动调整大小。
通过将平铺视图的自动调整掩码设置为UIViewAutoresizingNone
(通过取消选择Interface Builder中的所有弹簧和支柱),可以轻松避免此行为。
请注意调试视图大小调整问题的工具,如下所示:
po viewVariableOrAddress
(调用其参数的description
方法并打印结果)。po [viewVariableOrAddress recursiveDescription]
。请注意,他的方法是私有的,不得在生产代码中调用(否则将拒绝该应用程序)。