如果滚动视图下方有视图,则调整滚动视图缩进不起作用

时间:2013-10-16 19:17:41

标签: ios uiscrollview storyboard ios7 autolayout

我在Xcode 5.0.1的故事板中工作,制作适用于iOS 7的应用程序。

我有一个视图控制器,滚动视图显示在导航控制器内,底部有一个工具栏。

滚动视图正确插入,并在启用调整滚动视图插图的情况下在顶部和底部栏下正确滚动。

我想添加一个不滚动滚动视图后面的背景图像。当我执行此操作时,就好像未选中调整滚动视图插入标记一样,滚动条和内容始终位于顶部和底部条形的后面。

如果我将视图放在故事板中,或者在ViewDidLoad或ViewWillAppear中进行编程,或者如果我将它放在故事板中的更高点然后以编程方式将其移到后面,则无关紧要,我得到相同的结果,滚动不会调整条形。

如果我在viewDidAppear中加载或移动它,那么它可以工作,但是对于我的过渡来说太迟了,我需要在开始变得可见的时候在背景中查看。

我怀疑这是ios7的一个错误,是否有任何已知的解决方法?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,解决方案并不简单。我所做的是UIScrollView的子类,添加带有图像的子图层并将其与滚动一起移动。我确信有更好的方法可以做我做的事情,但它确实有效。

这是ScrollViewWithBackgroundImage.m。我没有使用arc,如果你是,只需删除dealloc方法并将'retain'改为'strong'。此外,如果您不这样做,则需要添加#import <QuartzCore/QuartzCore.h>

#import "ScrollViewWithBackgroundImage.h"

@interface ScrollViewWithBackgroundImage()
@property (nonatomic, retain) CALayer *backgroundLayer;
@end

@implementation ScrollViewWithBackgroundImage

- (void)setBackgroundImage:(UIImage *)image {
    CALayer *backgroundImageLayer = [CALayer layer];
    backgroundImageLayer.contents = (id)[image CGImage];
    backgroundImageLayer.bounds = self.bounds;
    backgroundImageLayer.position = self.center;
    [self.layer insertSublayer:backgroundImageLayer atIndex:0];

    self.backgroundLayer = backgroundImageLayer;
    [self setNeedsLayout];
}

-(void)layoutSubviews {
    [super layoutSubviews];

    CGRect frame = self.bounds;
    frame.origin = [self convertPoint:self.bounds.origin toView:self];
    [CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
        self.backgroundLayer.frame = frame;
    [CATransaction commit];
}

- (void)dealloc {
    [_backgroundLayer release];
    [super dealloc];
}

@end

和ScrollViewWithBackgroundImage.h

@interface ScrollViewWithBackgroundImage : UIScrollView

- (void)setBackgroundImage:(UIImage *)image;

@end

然后,在视图控制器中:

- (void)viewDidLoad {
    [super viewDidLoad];

    // The rest of your viewDidLoad method...

    [self.scrollView setBackgroundImage:[UIImage imageNamed:@"bk.default.png"]];
}

编辑: 问题的原因是automaticallyAdjustScrollViewInsets属性仅在滚动视图是堆栈中的第一个子视图时才有效。您可以在视图中嵌入滚动视图,只要滚动视图位于堆栈的底部(在界面构建器的顶部),它仍然可以工作。每当您添加滚动视图下方的另一个子视图时,自动插入调整将停止工作。