Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Autolayout正在更改UIScrollView';旋转时的偏移量_Ios_Objective C_Uiscrollview_Autolayout - Fatal编程技术网

Ios Autolayout正在更改UIScrollView';旋转时的偏移量

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 =

为了试验我一直使用的autolayout和uiscrollview

我对其进行了编辑,以在滚动视图中包含2个视图,我设置了自动布局约束,以水平相邻放置视图,并将其大小设置为填充滚动视图框架

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

在回顾了之前的几篇文章之后:&。您似乎可以通过以下步骤之一找到解决方案:

  • 编程方式:如果您的UIScrollView的父VC不直接在Nav堆栈上-
  • ~编辑~

        // 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;
    }