【问题标题】:UIScrollView child jumping after UINavigationController push and popUINavigationController 推送和弹出后 UIScrollView 子跳转
【发布时间】:2012-11-16 17:00:42
【问题描述】:

所以我的 iPad 应用程序上有一个 UIScrollView,它有一个子视图(它本身是所有控件的父视图)。滚动一切正常。旋转效果很好(整个视图适合纵向,横向滚动)。一旦在UINavigationController 上推了一个新屏幕,然后回来打破它。

看起来好像滚动视图的子视图的框架相对于滚动位置向上移动了,但滚动视图一直保持在底部(整个子视图向上移动)。

我已经尝试与情节提要中的 Constraints 抗争了好几个小时,但无法找出可能导致这种情况的原因。

【问题讨论】:

  • 试过约束选项吗?
  • 是的,正如问题中所说的
  • 你有什么发现吗?我在导航控制器中有滚动视图的 iPhone 上看到了相同的行为。我注意到的另一件事是,如果我再次按下并弹出,则设置正确。所以每隔一段时间它似乎就有问题。
  • 不,我从来没想过。如果您自己做,请进行更新。

标签: ios xcode uiscrollview interface-builder xcode-storyboard


【解决方案1】:

我在滚动视图和自动布局方面遇到了同样的问题(iOS 6 - 不工作,iOS 7 - 工作正常),当然这不是完美的解决方案,但似乎可以工作。希望对你有帮助:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self performSelector:@selector(content) withObject:nil afterDelay:0.0];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    offset = self.scrollView.contentOffset;
}

- (void)viewDidDisappear:(BOOL)animated
{
   [super viewDidDisappear:animated];

   self.scrollView.contentOffset = CGPointZero;
}

- (void)content
{
    [self.scrollView setContentOffset:offset animated:NO];
}

【讨论】:

    【解决方案2】:

    在子视图消失之前获取子视图的框架然后每次视图出现在-(void)viewWillAppear:(BOOL)animated中手动重置子视图的框架。

    -(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    globalFrameVariable = subview.frame;
    [subview removeFromSuperview];
    }
    
    -(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [subview setFrame:globalFrameVariable];
    [scrollView addSubview:subview];
    }
    

    【讨论】:

      【解决方案3】:

      这是我找到的一个简单解决方案。 (假设父视图是为了跨越整个 contentSize)使用 UIScrollView 的这个子类:

      @interface BugFixScrollView : UIScrollView
      @end
      @implementation BugFixScrollView
      -(void)layoutSubviews
      {
          [super layoutSubviews];
          UIView *view=[self.subviews firstObject];
          if(view)
          {
              CGRect rect=view.frame;
              rect.origin=CGPointMake(0, 0);
              view.frame=rect;
          }
      }
      @end
      

      每次自动布局搞砸时,它都会简单地重置原点。这个类可以在InterfaceBuilder中使用,只需在放置UIScrollView后更改类名即可。

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 1970-01-01
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多