41

我正在调整详细视图控制器的状态,就在它被推送到navigationController

[self.detailViewController detailsForObject:someObject];
[self.navigationController pushViewController:self.detailViewController
                                     animated:YES];

DetailViewController一个 scrollView 驻留。我根据传递的对象调整了哪些内容:

- (void)detailsForObject:(id)someObject {
    // set some textView's content here
    self.contentView.frame = <rect with new calculated size>;

    self.scrollView.contentSize = self.contentView.frame.size;
    self.scrollView.contentOffset = CGPointZero;
}

现在,这一切都有效,但 scrollView 会contentOffset在 navigationController 的滑入动画期间对其进行调整。将contentOffset设置为最后一个 contentSize 和新计算的值之间的差异。这意味着第二次打开 detailsView 时,详细信息将滚动到某个不需要的位置。即使我明确地设置contentOffset为。CGPointZero

我发现重置contentOffsetin- viewWillAppear没有效果。我能想出的最好办法是重置 contentOffset in viewDidAppear,导致内容明显上下移动:

- (void)viewDidAppear:(BOOL)animated {
    self.scrollView.contentOffset = CGPointZero;
}

有没有办法防止 a在更改时对其UIScrollView进行调整?contentOffsetcontentSize

4

8 回答 8

63

在使用 a推送UIViewController包含 a时发生。UIScrollViewUINavigationController

iOS 11+

解决方案 1(Swift 代码):

scrollView.contentInsetAdjustmentBehavior = .never

解决方案 2(故事板)

在此处输入图像描述

IOS 7

解决方案 1(代码)

设置@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsetsNO

解决方案 2(故事板)

取消选中Adjust Scroll View Insets

调整滚动视图插图

iOS 6

解决方案(代码)

设置UIScrollView' 属性contentOffsetcontentInsetviewWillLayoutSubviews. 示例代码:

- (void)viewWillLayoutSubviews{
  [super viewWillLayoutSubviews];
  self.scrollView.contentOffset = CGPointZero;
  self.scrollView.contentInset = UIEdgeInsetsZero;
}
于 2013-12-02T10:07:53.657 回答
15

尽管我找到了解决方案,但此问题的原因仍不清楚。通过在调整它们之前重置内容大小和偏移量, UIScrollView 不会动画:

- (void)detailsForObject:(id)someObject {
    // These 2 lines solve the issue:
    self.scrollView.contentSize = CGSizeZero;
    self.scrollView.contentOffset = CGPointZero;

    // set some textView's content here
    self.contentView.frame = <rect with new calculated size>;

    self.scrollView.contentSize = self.contentView.frame.size;
    self.scrollView.contentOffset = CGPointZero;
}
于 2011-07-11T13:45:41.833 回答
3

我在 UIScrollview 上遇到了同样的问题,问题是由于未设置 contentSize 引起的。将 contentSize 设置为项目数后,此问题已解决。

self.headerScrollView.mainScrollview.contentSize = CGSizeMake(320 * self.sortedMaterial.count, 0);
于 2013-09-23T13:29:19.217 回答
3

这对我有用:
在情节提要中,在 scrollView 的 Size Inspector 中,将 Content Insets Adjustment Behavior 设置为“从不”。

在此处输入图像描述

于 2018-07-13T20:54:52.017 回答
0

你的 scrollView 是 DetailViewController 的根视图吗?如果是,请尝试将 scrollView 包装在普通UIView视图中,并将后者作为 DetailViewController 的根视图。由于UIViews 没有contentOffset属性,因此它们不受导航控制器所做的内容偏移调整(由于导航栏等原因)的影响。

于 2011-06-29T16:21:38.900 回答
0

我遇到了这个问题,对于特定情况 - 我不调整大小 - 我使用了以下内容:

float position = 100.0;//for example

SmallScroll.center = CGPointMake(position + SmallScroll.frame.size.width / 2.0, SmallScroll.center.y);

同样适用于 y:anotherPosition + SmallScroll.frame.size.height / 2.0

因此,如果您不需要调整大小,这是一个快速而轻松的解决方案。

于 2012-08-16T13:29:25.127 回答
0

添加到KarenAnne的答案:

iOS 11+

不推荐使用automaticAdjustsScrollViewInsets

改用这个:

故事板:

在此处输入图像描述

代码(斯威夫特):

scrollView.contentInsetAdjustmentBehavior = .never
于 2021-05-24T15:27:55.377 回答
0

我遇到了类似的问题,UIKit 在推送动画期间设置了我的 scrollView 的 contentOffset。

这些解决方案都不适合我,可能是因为我支持 iOS 10 和 iOS 11。

我可以通过子类化我的滚动视图来解决我的问题,以防止 UIKit 在从窗口中删除滚动视图后更改我的偏移量:

/// A Scrollview that only allows the contentOffset to change while it is in the window hierarchy. This can keep UIKit from resetting the `contentOffset` during transitions, etc.
class LockingScrollView: UIScrollView {
    override var contentOffset: CGPoint {
        get {
            return super.contentOffset
        }
        set {
            if window != nil {
                super.contentOffset = newValue
            }
        }
    }
}
于 2018-07-17T18:52:34.933 回答