【问题标题】:UIScrollview Autolayout IssueUIScrollview 自动布局问题
【发布时间】:2012-09-16 19:43:41
【问题描述】:

我的自动布局(可能)和我的滚动视图有问题!

我的问题

  1. 我向下滚动

2.然后我推送到另一个视图

3.然后我回去,滚动视图看起来像那样,我无法滚动到最高点。(我在滚动视图的弹跳中看到它)

谁能帮帮我?

【问题讨论】:

  • 你设置的帧大小正确吗?
  • 如果您在没有 nib 的情况下以编程方式编写滚动视图,请将代码块添加到问题中......这可以帮助您获得更好的答案
  • 我什么都没写!一切都在 interfacebuilder 中设置
  • 像这样设置滚动视图的框架 CGRect scrollFrame = CGRrectMake(x, y, width , height ); ScrollView.frame = scrollFrame;
  • 在相关线程stackoverflow.com/a/18475112/318790修复了这个问题

标签: iphone ios uiscrollview ios6 autolayout


【解决方案1】:

包含视图控制器中的以下代码 sn-p 似乎也解决了这个问题,而不依赖于显式大小:

- (void)viewDidDisappear:(BOOL)animated {
  [super viewDidDisappear:animated];
  self.mainScrollView.contentOffset = CGPointZero;
}

它确实将内容偏移量重置为原点,但其他答案似乎也是如此。

【讨论】:

  • 这行得通!但是当我将它设置回正确的值时(在 viewdidappear 中)它在闪烁!所以我继续寻找更好的方法......
  • 在 viewDidLayoutSubviews 中设置正确的偏移量,一切都很好:)
  • 这是一个令人难以置信且令人沮丧的错误/问题。在 Interface Builder 中进行设置时,人们还没有准备好处理这个错误。
  • 我也不得不使用这个修复,但在我展示我的 UIViewController 之前,我让 scrollView 滚动到顶部。我的 scrollView 不在屏幕上,所以我没有闪烁。但是您可以创建一个方法将滚动视图重置为其原点并在 1 秒左右后调用它(performSelector:withObject:afterDelay:);当你开始展示你的 UIViewController 时。
  • 看起来苹果已经在最新的 iOS 中修复了这个问题! :)
【解决方案2】:

如果您仍在寻找答案,我在头撞墙两天后今天找到了答案。我只是将代码粘贴给您,但最重要的是当您加载滚动视图时..

    -(void)viewWillAppear:(BOOL)animated{

    [scrollView setFrame:CGRectMake(0, 0, 320, 800)];
}

-(void)viewDidAppear:(BOOL)animated
{
    [scrollView setScrollEnabled:YES];
    [scrollView setContentSize:CGSizeMake(320, 800)];

}

这一切都是在-(void)viewDidLoad之前加载的

请注意,两个实例中的高度都是 800,这对于解决此问题至关重要。祝你的项目好运;)

【讨论】:

    【解决方案3】:

    我正在使用亚当的解决方案,但是当我用动画解散时开始遇到问题:YES。在我的代码中,内容偏移会在 viewWillAppear 之后设置一段时间(因为 viewWillAppear 似乎太早了)。

    - (void)viewDidDisappear:(BOOL)animated
    {
        self.scrollOffsetToPersist = self.scrollView.contentOffset;
        self.scrollView.contentOffset = CGPointZero;
    
        [super viewDidDisappear:animated];
    }
    
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    
        [[NSOperationQueue mainQueue] addOperationWithBlock:^
         {
             self.scrollView.contentOffset = self.scrollOffsetToPersist;
         }];
    }
    

    编辑:另一种更好的方法是在 viewDidLayoutSubviews 中重新设置它:)

    - (void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
    
        if(!CGPointEqualToPoint(CGPointZero, self.scrollOffsetToPersist))
        {
            self.scrollView.contentOffset = self.scrollOffsetToPersist;
            self.scrollOffsetToPersist = CGPointZero;
        }
    }
    

    【讨论】:

    • 请注意,如果您在 viewDidLayoutSubviews 中设置它,您可能还需要将偏移量保存在 viewDidDisappear: 中,否则当您呈现模态视图控制器时,滚动视图偏移量将跳转为零并且不会正确重置。我也向 Apple 提交了关于此行为的错误:openradar.appspot.com/radar?id=3011407
    • 我使用NSoperationQueue 解决了我的问题,并使用viewDidLayoutSubviews 方法并设置滚动视图的contectsize。谢谢@kukosk
    【解决方案4】:

    这不是很好,但是我通过在自动布局发生后在 viewDidAppear 中设置内容大小、设置 scrollOffset 并在 viewDidDisappear 中保持滚动偏移来击败自动布局(绝对不是正确的方式,但我已经厌倦了尝试!),然后在 viewDidAppear 中将滚动偏移设置回它的持久状态。

    像这样:

    -(void)viewDidAppear:(BOOL)animated{
        [super viewDidAppear:YES];
        self.scrollView.contentSize = self.scrollViewInnerView.frame.size;
        self.scrollView.contentOffset = [self.scrollOffsetToPersist CGPointValue];
    
    }
    
    -(void)viewDidDisappear:(BOOL)animated{
        [super viewDidDisappear:YES];
        self.scrollOffsetToPersist = [NSValue valueWithCGPoint:self.scrollView.contentOffset];
        self.scrollView.contentOffset = CGPointZero;
    }
    

    一点也不优雅,但我想分享一下。

    【讨论】:

    • 苹果写了同样的事情......可能是迄今为止最好的解决方案......但我认为 viewDidLayoutSubviews 是设置偏移量的更好位置
    • 是的,这对我有用。一个简单的想法,例如在滚动视图中调整子视图的大小,执行起来相当复杂......在最终解决这个问题之前花了几个小时搞砸 UIScrollView 和自动布局。
    【解决方案5】:

    我使用 UITabBarController 和具有自动布局的不同视图。视图比设备的屏幕长。从一个选项卡切换到另一个选项卡有时会导致您描述的问题。仅当视图在切换之前向下滚动时才会发生这种情况。我在这里尝试了所有建议,但这对我的情况不起作用。我的解决方案是在离开视图之前再次向上滚动。至少在 iOS 6 中解决这个错误:

    -(void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        [scrollView setContentOffset:CGPointZero animated:NO];
    }
    

    【讨论】:

      【解决方案6】:

      问题原因是 ScrollView 在应用 AutoLayout 之前设置了 ContentOffset。解决办法是:

      创建私有财产

      @property (assign,nonatomic) CGPoint scrollviewContentOffsetChange;
      

      添加代码查看方法

      - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        self.scrollView.contentOffset = CGPointZero;
      }
      
      - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        self.scrollviewContentOffsetChange = self.scrollView.contentOffset;
      }
      
      - (void)viewDidLayoutSubviews {
        [super viewDidLayoutSubviews];
      
        self.scrollView.contentOffset = self.scrollviewContentOffsetChange;
      }
      

      【讨论】:

        【解决方案7】:

        你试过吗?

        self.automaticallyAdjustsScrollViewInsets = NO;
        

        就我而言,这解决了我的问题。

        【讨论】:

        • 这是一个 iOS 6 问题。在 iOS 7 中一切正常!
        • 这个问题在 ios9 又出现了
        【解决方案8】:

        我遇到了同样的问题。结果我在内容视图上设置了一个约束,将它的 y 中心与超级视图的 y 中心对齐。当我删除这个约束时,它工作得很好。

        【讨论】:

          【解决方案9】:

          试试这个

          @property (nonatomic, assign) CGPoint scrollViewContentOffsetChange;
          
          - (void)viewWillAppear:(BOOL)animated
          {
              [super viewWillAppear:animated];
              self.scrollView.contentOffset = CGPointZero;
          }
          
          - (void)viewWillDisappear:(BOOL)animated {
              [super viewWillDisappear:animated];
              self.scrollViewContentOffsetChange = _scrollView.contentOffset;
          }
          
          - (void)viewDidLayoutSubviews {
              [super viewDidLayoutSubviews];
              _scrollView.contentOffset = self.scrollViewContentOffsetChange;
          }
          

          【讨论】:

            猜你喜欢
            • 2018-12-01
            • 2016-06-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-04
            • 2021-11-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多