iOS ScrollView setContentSize 不起作用

Posted

技术标签:

【中文标题】iOS ScrollView setContentSize 不起作用【英文标题】:iOS ScrollView setContentSize not Working 【发布时间】:2016-10-07 10:24:40 【问题描述】:

我正在使用 Xcode 8、ios 10。我从 Storyboard 中创建了 ScrollView。我的流程是

viewDidLoad 方法有 Restcall,从服务器获取信息。 返回时,我解析了 Response 并基于该 Create UIElements in Method 然后添加到一个 ParentView。 最后 ParentView 将被添加到 ScrollView 中。
[self.scrollView addSubview:parentView];
self.scrollView.frame = CGRectMake(0, 0, 320, parentView.frame.size.height);
[self.scrollView setContentSize:CGSizeMake(320, parentView.frame.size.height)];

当我在这段代码之后打印 Scrollview 高度时,它显示“680”,它超过了我的视图高度。我已尝试使用“viewDidLayoutSubviews”方法,但 ScrollView 仍然无法正常工作。 有谁知道为什么它不滚动?

【问题讨论】:

see links provided inside here。可能是布局设置的问题。 你使用自动布局吗? 【参考方案1】:

您的代码中的问题是您从 父视图 设置 scrollview 高度和 contentSize 高度。

您应该执行以下操作:-

[self.scrollView addSubview:parentView];

self.scrollView.frame = CGRectMake(0, 0, 320, [UIScreen mainScreen].bounds.size.height);

[self.scrollView setContentSize:CGSizeMake(320, parentView.frame.size.height)];

希望这会有所帮助

【讨论】:

非常感谢你拯救了我的一天。【参考方案2】:

您设置了错误的框架UIScrollView。这就是您的内容大小不起作用的原因。

试试这个,

[self.scrollView addSubview:parentView];
self.scrollView.frame = CGRectMake(0, 0, 320, [UIScreen mainScreen].bounds.size.height);
[self.scrollView setContentSize:CGSizeMake(320, parentView.frame.size.height)];

【讨论】:

非常感谢您的回复。【参考方案3】:

尝试在“Interface Builder Document”下禁用自动布局 disable:“Use Autolayout”

它在我的情况下工作。

【讨论】:

【参考方案4】:

动态计算UIScrollview contentSize(取决于子视图框架)并将其设置在viewDidLayoutSubviews主线程中的异步

斯威夫特:

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

【讨论】:

【参考方案5】:

在设置滚动视图的框架之前尝试设置layoutIfNeeded

我的情况跟你一样。

-(void)viewDidLoad
    [self.view layoutIfNeeded];
    self.myCustomScrollView.frame = self.contentView.bounds;

AutoLayout 似乎与 Xcode8 中的帧位置不同。

只是不知道为什么,但它对我有用。

【讨论】:

以上是关于iOS ScrollView setContentSize 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ios 中tableview和scrollView的区别

ios的scrollview嵌套webview,解决事件冲突

mas 中scrollview碰到的问题。ios10.0后

iOS - ScrollView更改背景

iOS 11 ScrollView偏移问题解决

iOS_7_scrollView大图缩放