【问题标题】:UIScrollView setContentSize doesn't workUIScrollView setContentSize 不起作用
【发布时间】:2013-12-30 02:09:47
【问题描述】:

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

  1. 我创建了一个 Tab Bar 项目
  2. 我创建了一个视图控制器, 将其嵌入导航控制器并将其连接为标签栏 项目 #0
  3. 我在视图中放置了一个 UIScrollView。
  4. 我在为此视图创建的自定义 UIViewController 中连接了滚动视图。
  5. 我合成了我的 IBOutlet 并将委托设置为 self。我也 在 .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]"。它在应该上下滚动的地方左右滚动

请帮忙!

【问题讨论】:

  • 你在使用自动布局吗?
  • 如开头所述,我禁用了它。在应用程序中搞砸了太多东西
  • 你不是说日志的高度是 20000,宽度是 0?
  • 不,这就是问题所在!它只在左右轴上滚动,我希望它只在上下轴上滚动
  • 你是在 xcode 5 上开发吗???属性检查器中有一个选项,( Autoresize Subview ),确保它没有被选中,这只是在新的 Xcode 中,我不确定它是否会解决你的问题,但它可能:)

标签: ios iphone objective-c uiscrollview autolayout


【解决方案1】:

viewDidLoad 方法中,frame 可能不正确,将代码移至该方法:

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Your code

}

【讨论】:

  • 遗憾的是,这并没有改变任何事情。
  • 同时检查方向
  • 什么意思?我的滚动视图占用了我的 ViewController 上的所有空间
  • 你确定 self.view 不是 nil 并且 self.view.frame 是正确的吗?
  • 是的,我 NSLogged 并且 self.view 不是零。我试过 [self.scrollView setContentSize:CGSizeMake(1500, 20000)];不会改变任何事情。
【解决方案2】:

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

  1. 确保您像这样添加到 .h 文件中:

    @interface yourViewController : UIViewController <UIScrollViewDelegate> {
    
     }
    
  2. 尝试将此 sn-p 代码移动到“viewWillLoad”方法:

    - (void)viewWillAppear:(BOOL)animated {
         self.scrollView.delegate = self;
         [self.scrollView setScrollEnabled:YES];
    
         [self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, 20000)];
    }
    

【讨论】:

  • 我知道的没错!这才是真正令人沮丧的。我试过你的方式,但 viewWillLoad 没有被调用。从不。
  • 我创建了一个全新的项目,只是为了测试我的 UIScrollView 代码(如上)。没有任何东西可以被破坏。它可以是我的 .plist 中的一个设置,它仍然认为它激活了自动布局吗?我正在使用 Xcode 5.0.2
  • 您是否禁用了情节提要中所有视图控制器的自动布局?
  • 对不起,我不是说 viewWillLoad,试试 viewWillAppear
  • NB 没有“-viewWillAppear”方法,只有“-viewWillAppear:(BOOL)animated”。
【解决方案3】:

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

【讨论】:

  • 谢谢!在我阅读您的答案并在 viewDidLayoutSubviews 中设置内容大小之前,我也没有让我的滚动视图工作。
  • 在 viewDidLayoutSubviews 中设置 contentSize 属性对我有用。与自动布局无关。
  • 天哪。经过几天无休止的搜索和各种解决方案无济于事,这篇文章就是答案。非常感谢。
【解决方案4】:

使用此代码。 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
    }
}

目标 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】:
    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 的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多