UIScrollView setContentSize不起作用

ant*_*tic 9 iphone objective-c uiscrollview ios autolayout

我对UIScrollView有一个非常大的问题.为了确保它不是我的实际项目,我为iOS 6和7创建了一个新项目,仅限iPhone.我禁用了autolayout.

  1. 我创建了一个Tab Bar项目
  2. 我创建了一个视图控制器,将其嵌入导航控制器并将其连接为标签栏项目#0
  3. 我在我的视图中放了一个UIScrollView.
  4. 我连接了为此视图创建的自定义UIViewController中的scrollview.
  5. 我合成了我的IBOutlet并将委托设置为自己.我还在.h中实现了委托

这是我的代码(ViewDidLoad):

    self.scrollView.delegate = self;
    [self.scrollView setScrollEnabled:YES];

    [self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, 20000)];


    NSLog(@"contentSize width %f", self.scrollView.contentSize.width);
    NSLog(@"contentSize height %f", self.scrollView.contentSize.height);

    NSLog(@"%@", NSStringFromCGAffineTransform(self.scrollView.transform));
Run Code Online (Sandbox Code Playgroud)

它返回"contentSize width 20000.000000","contentSize height 0.000000"和"[1,0,0,1,0,0]".它向左或向右滚动,向上滚动

请帮忙!

mr.*_*osa 39

在我意识到我没有设置UIScrollView委托之前,我遇到了同样的问题.此外,如果您使用自动布局,则需要等待将布局应用于UIScrollView.这意味着您应该在"viewDidLayoutSubviews"中设置内容大小.


qua*_*tym 6

在viewDidLoad方法中,框架可能不正确,将代码移动到此方法:

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Your code

}
Run Code Online (Sandbox Code Playgroud)


Kar*_*yan 6

使用此代码。ScrollView setContentSize 应在主线程中异步调用。

迅速:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    DispatchQueue.main.async {
        var contentRect = CGRect.zero

        for view in self.scrollView.subviews {
           contentRect = contentRect.union(view.frame)
        }

        self.scrollView.contentSize = contentRect.size
    }
}
Run Code Online (Sandbox Code Playgroud)

目标 C:

 - (void)viewDidLayoutSubviews {
     [super viewDidLayoutSubviews];

     dispatch_async(dispatch_get_main_queue(), ^ {
                        CGRect contentRect = CGRectZero;

                        for(UIView *view in scrollView.subviews)
                           contentRect = CGRectUnion(contentRect,view.frame);

                           scrollView.contentSize = contentRect.size;
                       });
}
Run Code Online (Sandbox Code Playgroud)