UIScrollView setContentSize不起作用

问题描述 投票:9回答:5

我对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));

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

请帮忙!

ios iphone objective-c uiscrollview autolayout
5个回答
39
投票

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


6
投票

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

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Your code

}

4
投票

使用此代码。 ScrollView setContentSize应该在主线程中调用async。

迅速:

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
    }
}

目标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;
                       });
}

3
投票

好的,您的代码绝对没有问题。所以有些建议:

  1. 确保您已添加到.h文件中,如下所示: @interface yourViewController : UIViewController <UIScrollViewDelegate> { }
  2. 尝试将此代码段移动到“viewWillLoad”方法: - (void)viewWillAppear:(BOOL)animated { self.scrollView.delegate = self; [self.scrollView setScrollEnabled:YES]; [self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, 20000)]; }

0
投票
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    var contentRect = CGRect.zero
    for view: UIView in scrollView.subviews {
        if !view.isHidden {
            contentRect = contentRect.union(view.frame)
        }
    }

    scrollView.contentSize = contentRect.size
    scrollView.contentSize.width = self.view.frame.width
}

使用Swift 3.X代码。转换@Karen Hovhannisyan的回答。

© www.soinside.com 2019 - 2024. All rights reserved.