Dam*_*ien 12 objective-c uiscrollview ios ios5
在我的应用程序(代码非常类似于Apple的WWDC10的PhotoScroller演示)中,我有一个UIScrollView.在滚动视图中,我用以下代码覆盖了layoutSubviews:
- (void) layoutSubviews {
[super layoutSubviews];
// center the image as it becomes smaller than the size of the screen
CGSize boundsSize = self.bounds.size;
...
}
Run Code Online (Sandbox Code Playgroud)
在iOS 4.x中,如果应用程序在横向模式下启动(用户将其保持为横向),则layoutSubviews将被调用两次(非常快).第一次调用它时,boundsSize具有指示其纵向的尺寸,但之后立即再次调用它,self.bounds.size返回指示设备处于landsacpe并且我的布局计算正常工作的尺寸.
在iOS 5.x中,layoutSubviews仅调用一次,其中bounds.size返回指示纵向的尺寸,并且它没有得到第二次调用,因此我的所有计算代码都搞砸了.
如果用户physcially旋转设备,然后layoutSubviews被调用和正常工作 - 这样用户就开始横向应用(平不正确地),旋转为纵向(平correcty),然后转回到风景(现提请正确).
它是我缺少的layoutSubviews的第二次"自动"调用.
有人注意到这个或有什么建议吗?
更新:
我确实在iOS 5的UIKit发行说明中找到了这个,但我不确定它是否相关,甚至是这种变化的影响.
iOS 5中的旋转回调不适用于通过全屏显示的视图控制器.这意味着,如果你的代码呈现了另一个视图控制器视图控制器,然后用户随后旋转设备,以不同的取向,在解雇,底层控制器(即呈现控制器)将不会收到任何旋转回调.但请注意,呈现控制器将获得aviewWillLayoutSubviews来电时它被重新显示,并且interfaceOrientation属性可以从这种方法进行查询和使用正确铺陈控制器.
进一步更新:
使用[UIView recursiveDescription],转储视图层次结构,我得到以下输出:
iOS 4(运行正常):
肖像:
2011-12-19 15:57:06.400 stroom[10889:11603] <0x5e7f9b0 stroomViewController.m:(402)> <UIView: 0x6a6f2f0; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x6a659d0>>
| <UIScrollView: 0x5e911e0; frame = (-20 0; 808 1024); clipsToBounds = YES; autoresize = LM+W+RM+TM+H+BM; layer = <CALayer: 0x5e91370>; contentOffset: {0, 0}>
| | <stroomFullScreenPhotoScrollView: 0x5ea1010; baseClass = UIScrollView; frame = (20 0; 768 1024); clipsToBounds = YES; layer = <CALayer: 0x5ea0940>; contentOffset: {0, 0}>
| | | <UIImageView: 0x5ea2600; frame = (0 224; 768 576); transform = [0.75, 0, 0, 0.75, 0, 0]; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x5ea0890>>
Run Code Online (Sandbox Code Playgroud)
景观:
2011-12-19 15:57:34.522 stroom[10889:11603] <0x5e7f9b0 stroomViewController.m:(402)> <UIView: 0x6d96c30; frame = (0 0; 768 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x6d66440>>
| <UIScrollView: 0x5e9eb70; frame = (-27 0; 1078 768); clipsToBounds = YES; autoresize = LM+W+RM+TM+H+BM; layer = <CALayer: 0x5eadde0>; contentOffset: {0, 0}>
| | <stroomFullScreenPhotoScrollView: 0x6dab850; baseClass = UIScrollView; frame = (20 0; 1038 768); clipsToBounds = YES; layer = <CALayer: 0x6dab2e0>; contentOffset: {0, 0}>
| | | <UIImageView: 0x5e97f70; frame = (0 224; 1024 768); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x5e97fa0>>
Run Code Online (Sandbox Code Playgroud)
iOS 5(工作不正常):
肖像:
2011-12-19 15:55:59.530 stroom[10850:16103] <0x848b520 stroomViewController.m:(402)> <UIView: 0xa884710; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0xa8849a0>>
| <UIScrollView: 0xa883820; frame = (-20 0; 808 1024); clipsToBounds = YES; autoresize = LM+W+RM+TM+H+BM; layer = <CALayer: 0xa883a80>; contentOffset: {0, 0}>
| | <stroomFullScreenPhotoScrollView: 0x8699630; baseClass = UIScrollView; frame = (20 0; 768 1024); clipsToBounds = YES; layer = <CALayer: 0x8699360>; contentOffset: {0, 0}>
| | | <UIImageView: 0x869a7c0; frame = (0 0; 768 576); transform = [0.75, 0, 0, 0.75, 0, 0]; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x869a800>>
Run Code Online (Sandbox Code Playgroud)
景观:
2011-12-19 15:56:32.521 stroom[10850:16103] <0x848b520 stroomViewController.m:(402)> <UIView: 0x8498530; frame = (0 0; 768 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x8498560>>
| <UIScrollView: 0x849ead0; frame = (-27 0; 1077 768); clipsToBounds = YES; autoresize = LM+W+RM+TM+H+BM; layer = <CALayer: 0x848f390>; contentOffset: {808, 0}>
| | <stroomFullScreenPhotoScrollView: 0x81e4b80; baseClass = UIScrollView; frame = (828 0; 768 1024); clipsToBounds = YES; layer = <CALayer: 0x81e7dc0>; contentOffset: {0, 0}>
| | | <UIImageView: 0x81e5090; frame = (0 0; 768 576); transform = [0.75, 0, 0, 0.75, 0, 0]; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x81e5010>>
Run Code Online (Sandbox Code Playgroud)
从这些我可以看到iOS 5中UIScrollView的contentOffset看起来不正确,并且在iOS 5中横向框架具有不正确的尺寸,它们在iOS 4中看起来具有正确的尺寸.
最终,我偶然发现了这个问题的解决方案。我将在这里提供答案,因为它可能对其他人有帮助。
我的解决方案是在我的视图控制器上实现该- (void)viewWillAppear:(BOOL)animated方法。我没有,但我的所有设置逻辑都在- (void) viewDidLoad方法中。
特别是,我实现了以下内容:
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
CGRect bounds = pagingScrollView.bounds; // <=== this was the key
// ... use the bounds in my view setup logic
}
Run Code Online (Sandbox Code Playgroud)
在我看来,iOS 5(与之前版本的操作系统相比)发生了变化。当设备处于横向状态时加载视图时,bounds视图上的属性不会反映方向转换,直到viewWillAppear。以前,边界值对我来说是正确的,viewDidLoad但是将计算和bounds属性的读取移出并移入viewWillAppear就可以了。
当我进行测试时,在 iOS4 中一切都工作正常。
也许,我应该一直阅读该bounds属性viewWillAppear,这很可能是更正确的行为。然而,iOS4 和 iOS 5 之间发生了一些变化,我无法找到相关文档。
`
| 归档时间: |
|
| 查看次数: |
4621 次 |
| 最近记录: |