UIScrollView setContentSize不起作用

时间:2013-12-11 21:36:00

标签: ios iphone objective-c uiscrollview autolayout

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

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

    这是我的代码(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]“。它左右滚动,上下滚动

    请帮忙!

5 个答案:

答案 0 :(得分:39)

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

答案 1 :(得分:6)

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

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Your code

}

答案 2 :(得分: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 :(得分: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)];
    }
    

答案 4 :(得分:0)

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    var contentRect = CGRect.zero
    for view: UIView in scrollView.subviews {
        if !view.isHidden {
            contentRect = contentRect.union(view.frame)
        }
    }
    contentRect.size.height = contentRect.size.height
    scrollView.contentSize = contentRect.size
    scrollView.contentSize.width = self.view.frame.width
}

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