gpt4 book ai didi

ios - Autolayout 在旋转时改变了 UIScrollView 的 contentOffset

转载 作者:可可西里 更新时间:2023-11-01 03:39:05 24 4
gpt4 key购买 nike

为了试验自动布局和 uiscrollview,我一直在使用 this example

我已将其编辑为在 ScrollView 中包含 2 个 View ,我已经设置了自动布局约束以将 View 水平放置并设置为填充 ScrollView 框架的大小。

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]];

这很好地产生了我想要的效果。

但是,如果 ScrollView 的 contentOffset 不为零并且设备从纵向旋转到横向,则 ScrollView 的内容偏移会自动设置为 32px。 (见截图) content offset wrong

我已经尝试保存 contentOffset 并在 scrollViewDidEndDecelerating: 被调用时将其设置为这个保存的值,这有效但很丑陋,因为 ScrollView 滚动到 32px 偏移量然后回到我想要的地方。

如何控制 ScrollView 的contentOffset?自动布局约束是否错误?在调整 View 大小时,我可以添加额外的约束来控制 contentOffset 吗?

最佳答案

32px 从何而来?跟你的左右scrollView margin有关系吗?

每次换页时它是否保持错误的偏移量?如果是这种情况,您应该查看 scrollView 的 contentInsets 值。

否则,我通过分页管理 scrollView 的旋转是观察 scrollView 的 contentSize:

首先,当你加载 View 时,添加观察者:

[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];

关于ios - Autolayout 在旋转时改变了 UIScrollView 的 contentOffset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31844493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com