Ios Autolayout正在更改UIScrollView';旋转时的偏移量
为了试验我一直使用的autolayout和uiscrollview 我对其进行了编辑,以在滚动视图中包含2个视图,我设置了自动布局约束,以水平相邻放置视图,并将其大小设置为填充滚动视图框架Ios Autolayout正在更改UIScrollView';旋转时的偏移量,ios,objective-c,uiscrollview,autolayout,Ios,Objective C,Uiscrollview,Autolayout,为了试验我一直使用的autolayout和uiscrollview 我对其进行了编辑,以在滚动视图中包含2个视图,我设置了自动布局约束,以水平相邻放置视图,并将其大小设置为填充滚动视图框架 UIView *beeView = [[[NSBundle mainBundle] loadNibNamed:@"BeeView" owner:nil options:nil] firstObject]; beeView.translatesAutoresizingMaskIntoConstraints =
UIView *beeView = [[[NSBundle mainBundle] loadNibNamed:@"BeeView" owner:nil options:nil] firstObject];
beeView.translatesAutoresizingMaskIntoConstraints = NO;
[self.scrollView addSubview:beeView];
UIView *beeView2 = [[[NSBundle mainBundle] loadNibNamed:@"BeeView" owner:nil options:nil] firstObject];
beeView2.backgroundColor= [UIColor orangeColor];
beeView2.translatesAutoresizingMaskIntoConstraints = NO;
[self.scrollView addSubview:beeView2];
NSDictionary *views = @{@"beeView":beeView,@"beeView2":beeView2, @"scrollView":self.scrollView};
NSDictionary *metrics = @{@"height" : @200};
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[beeView(==scrollView)][beeView2(==beeView)]|" options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom metrics:metrics views:views]];
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[beeView(==scrollView)]|" options:kNilOptions metrics:metrics views:views]];
这很好地实现了我的意图
但是,如果滚动视图的contentOffset
为非零,并且设备从纵向旋转到横向,则滚动视图的内容偏移量将自动设置为32px
。(见截图)
我已尝试保存contentOffset
并在调用ScrollViewDiEndDecelling:
时将其设置为此保存的值,该选项工作正常,但很难看,因为滚动视图会滚动到32px的偏移量,然后返回到我想要的位置
如何控制滚动视图的
contentOffset
?自动布局约束是否错误?调整视图大小时,是否可以添加额外的约束来控制contentOffset
?32px的来源?它与您的左右滚动视图边距有关吗
它是否在每次更改页面时都保持错误的偏移量?如果是这种情况,您应该查看scrollView的contentInsets值
否则,我通过分页来管理scrollView上的旋转是观察scrollView的contentSize:
首先,加载视图时,添加观察者:
[self.scrollView addObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize)) options:0 context:nil];
然后,当contentSize值更改时,调整contentOffset:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (object == self.scrollView && [keyPath isEqualToString:NSStringFromSelector(@selector(contentSize))]) {
//Note that you should track your page index
self.scrollView.contentOffset = CGPointMake(self.pageIndex * self.scrollView.bounds.size.width, self.scrollView.contentOffset.y);
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
最后,卸载scrollView时移除观察者:
[self.scrollView removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize)) context:nil];
在回顾了之前的几篇文章之后:&。您似乎可以通过以下步骤之一找到解决方案:
// Without a Navigation Controller
self.automaticallyAdjustsScrollViewInsets = NO;
// With a Navigation Controller
self.parentViewController.automaticallyAdjustsScrollViewInsets = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
视图将布局子视图
方法中,尝试设置以下每个UIScrollView属性:
self.scrollView.contentOffset = CGPointZero;
self.scrollView.contentInset = UIEdgeInsetsZero;
我猜选项1和2的组合会起作用,这取决于导航堆栈的结构。我知道这是一个老问题,但是,如果它对任何人都有用,我已经创建了一个名为
LMPageView
的UIScrollView的子类,它可以自动应用必要的布局约束,并在旋转时调整内容偏移。该类作为GitHub上项目的一部分提供。示例用法(Swift):
以下是使用标记初始化页面视图的其他示例:
对于iOS 11.0及更高版本,以下方法为我解决了这个问题:
if (@available(iOS 11.0, *))
{
self.myScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
尝试将H:[beeView(=scrollView)][beeView2(=beeView)]
更改为H:-[beeView(=scrollView)]-[beeView2(=beeView)]-
32px只是我测量的东西,它一定是一个随机的小故障,但是addObserve方法工作得很好,谢谢!这是一个好建议;但是,请注意,UIKit不保证支持KVO。因此,虽然这种方法现在可能有效,但它可能会在未来的iOS更新中崩溃。另一种方法是子类化UIScrollView
并重写setContentSize:
。下面是我的答案,谢谢,但我没有使用任何导航控制器,所以这不会干扰它,我想这是一些奇怪的自动布局故障。将contentOffset设置为零并不特别有用,因为它只会将滚动视图设置回起始位置。@DotSlashSlash我很高兴您能够用我们的一个答案解决您的问题。我很确定,既然我已经解释过您没有使用导航控制器,您是否使用了self.automaticallyAdjustsScrollViewInsets=NO代码>在你的VC中它也可以解决这个问题。谢谢。这解决了我的scrollview在滚动或手动设置contentoffset后获得额外间距的问题
if (@available(iOS 11.0, *))
{
self.myScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}