【问题标题】:UIScrollView made in storyboard has frame value of zero在情节提要中制作的 UIScrollView 的帧值为零
【发布时间】:2012-10-11 04:39:00
【问题描述】:

我在故事板中创建了一个滚动视图,其中包含多个 UIImageView

问题是,该滚动视图的框架等于{0, 0, 0, 0},我不知道为什么。滚动视图在我的屏幕上可见,但我无法滚动它。

我已经尝试设置内容大小和框架,但没有成功。

【问题讨论】:

  • 你在做什么来检测帧大小?如果它是可见的,那么很有可能 {0, 0, 0, 0} 不是你看到的那个(或者,至少不是你看到的那个)。另外,包含滚动视图的控制器是如何创建的?
  • 为了检测帧大小,我做了一个: NSLog(@"%@", NSStringFromCGRect(self.theScrollView.frame));在 viewDidLoad 方法中
  • 虽然这是一个稍后的问题,但它与这个问题相同:stackoverflow.com/questions/11090999/… 提供的答案对我有用(使用 viewDidLayoutSubviews 而不是 view[Will|Did]Appear。

标签: iphone objective-c ios uiscrollview storyboard


【解决方案1】:

解决了!

事实上,我在 iOS 6.0 上开发了应用程序,我不得不取消选中情节提要属性上的“使用自动布局”复选框...

谢谢大家!

【讨论】:

  • 很高兴这个答案对您有所帮助:)
  • 我花了几个小时,但我终于偶然发现了这一点。为什么这样设置是超出我的。非常感谢您的回答
  • 自动布局在 iOS 6 及更高版本中默认开启。
【解决方案2】:

我也遇到了这个问题,但我需要使用自动布局。

我试图将 UIImageView 设置为子视图,然后进行一些计算以计算出最小、最大缩放比例并设置 zoomScale。

问题是我试图将 zoomScale 设置为零,因为滚动视图框架为零,这给了我这个错误:

<Error>: CGAffineTransformInvert: singular matrix.

所以我在 viewDidLoad / viewWillAppear 中设置了图像和 imageView(并隐藏了 imageView),然后在 viewDidAppear 中设置了 zoomScale(然后取消隐藏 imageView)。

这似乎运作良好,虽然我不能确定为什么。我猜它让滚动视图有机会正确设置其边界。

【讨论】:

    【解决方案3】:

    这里的问题是 AutoLayout,正如其他一些答案所表明的那样。具体来说,问题是直到 viewWillAppear 之后才会发生自动布局,如果您将代码放在 viewDidAppear 中,当您在用户观看时更改屏幕上的内容时,您将获得时髦的显示工件......

    如果您需要启用 AutoLayout,放置框架相关代码的最佳位置是:

    - (void)viewDidLayoutSubviews
    

    请记住,虽然它会一次又一次地调用,所以如果您只希望一些初始化代码运行一次,当视图显示时,您可以创建一个 BOOL 属性来存储初始布局是否已经完成。

    @property (assign, nonatomic) BOOL initialLayoutComplete;
    

    然后你可以这样写你的viewDidLayoutSubviews:

    - (void)viewDidLayoutSubviews {
        [super viewDidLayoutSubviews];
    
        if (!self.initialLayoutComplete) {
            // frame dependent code here...
        }
    }
    

    【讨论】:

      【解决方案4】:

      正如我在this answer 中提到的:滚动视图的框架在您使用viewWillAppear 方法之前不会被初始化。

      这似乎是 iOS 6 中的新行为,不确定是错误还是有意更改。

      您应该能够使用自动布局而不必担心这一点。

      【讨论】:

        【解决方案5】:

        你连接了 IBOutlet 了吗?

        您是否使用此代码初始化了滚动视图:

        self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 280, 360)];
        self.scrollView.contentSize = CGSizeMake(500, 360);
        //values are of course only example values
        

        如何将 UIImageView 添加到 scrollView 中?

        【讨论】:

        • 是的,我连接了 IBOutlet。我试图初始化滚动视图,但我有同样的问题。最后,我在情节提要中也有我的 UIImageViews 与拖放方式。提前致谢!
        【解决方案6】:

        我认为下面的 Enrico 评论有一个澄清。 帧大小将在 viewDidAppear 处具有正确的值(并且在 viewWillAppear 中将设置该值,但在该方法中它们仍然为零)

        【讨论】:

          猜你喜欢
          • 2014-02-22
          • 1970-01-01
          • 2012-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-01
          • 1970-01-01
          相关资源
          最近更新 更多