scrollView边界大小始终为零

时间:2013-10-13 19:44:09

标签: ios uiviewcontroller

我正在教自己IOS开发,我遇到了一个问题,我试图做的一个练习。基本上我有一个我想要显示的图片列表,所以我创建了一个带有这些图片列表的表视图,目标是单击一个单元格并将图片自动显示为屏幕大小。我关闭了ARC,所以我可以学会自己管理记忆。

当我在表视图中选择一个单元格时,它会调用一个具有滚动视图和图像视图的UIViewController。

storyboard snapshot

这就是我连接插座的方式:

How the outlets are connected

在PhotoViewController的方法viewWillAppear下的实现中,我写了这段代码:

- (void) viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];

[self.scrollView setZoomScale:1 animated:NO];
CGSize boundsSize = self.scrollView.bounds.size;
NSLog(@"@@@AMRO scrollboundsSize  is width %f and height %f", boundsSize.width, 
boundsSize.height);   

我需要boundsSize来帮助我弄清楚如何缩放图片。问题是它总是读为零。我知道基于故事板,boundsSize是320x455。显然我不想硬编码。

在我的PhotoViewController的.h中,我定义了:

@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;

现在,如果在ViewWillAppear中,我这样做:

CGRect fullScreenRect=[[UIScreen mainScreen] applicationFrame];
self.scrollView=[[UIScrollView alloc] initWithFrame:fullScreenRect];

然后我得到了界限,但是大小是关闭的,它的宽度是320.000000,高度是548.000000。我知道548的高度可能是因为它包括标题栏和底部的标签栏。有没有办法让我根据观看情况正确设置界限,如故事板中所示,为320×455。我看了其他人做同样事情的代码片段,他们甚至没有分配scrollView,是因为ARC是ON而且是自动管理的东西?

如果我使用这种方法,那么我确实得到了正确的大小,但这是正确的方法,我看过滚动视图从未初始化但是它们正确设置了边界的示例

CGRect viewBounds = self.view.bounds;
self.scrollView=[[UIScrollView alloc] initWithFrame:viewBounds];

2 个答案:

答案 0 :(得分:3)

尝试使用方法viewDidAppear获取边界和其他尺寸,而不是viewWillAppear

执行viewWillAppear时,您的滚动视图边界可能仍未初始化。

答案 1 :(得分:1)

如果您需要在屏幕上显示之前执行与几何相关的代码,您可以将其放在viewDidLayoutSubviews

@interface CustomViewController ()

@property (nonatomic) BOOL isFirstTimeViewDidLayoutSubviews; // variable name could be re-factored

@end

@implementation CustomViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.isFirstTimeViewDidLayoutSubviews = YES;
}

- (void)viewDidLayoutSubviews
{
    // only after layoutSubviews executes for subviews, do constraints and frames agree (WWDC 2012 video "Best Practices for Mastering Auto Layout")

    if (self.isFirstTimeViewDidLayoutSubviews) {

        // execute geometry-related code...
    }

    self.isFirstTimeViewDidLayoutSubviews = NO;
}