0

我正在使用 Xcode 5.0.1 制作故事板,为 iOS 7 制作应用程序。

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

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

我想添加一个不会在滚动视图后面滚动的背景图像。当我这样做时,就好像未选中 Adjusts Scroll View Insets 标志一样,滚动条和内容一直位于顶部和底部栏的后面。

我是否将视图放在情节提要中,或者在 ViewDidLoad 或 ViewWillAppear 中以编程方式进行,或者如果我将其放在情节提要的较高点然后以编程方式将其移到后面,这并不重要,我得到了同样的结果,滚动不会针对条进行调整。

如果我在 viewDidAppear 中加载或移动它,那么它可以工作,但是对于我的转换来说为时已晚,我需要在它开始变得可见时在后台查看视图。

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

4

1 回答 1

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只有当滚动视图是堆栈中的第一个子视图时,该属性才会起作用。您可以将滚动视图嵌入到视图中,只要滚动视图位于堆栈底部(在界面构建器的顶部),它仍然可以工作。每当您在滚动视图下方添加另一个子视图时,自动插入调整将停止工作。

于 2014-01-29T10:08:37.703 回答