【问题标题】:Adjust scroll view indents doesn't work if there is a view below the scrollview如果滚动视图下方有视图,则调整滚动视图缩进不起作用
【发布时间】:2013-10-25 01:35:55
【问题描述】:

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

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

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

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

我是否将视图放在情节提要中,或者在 ViewDidLoad 或 ViewWillAppear 中以编程方式执行,或者如果我将其放在情节提要的较高位置然后以编程方式将其移到后面,都没有关系,我得到了相同的结果,滚动不会针对条形进行调整。

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

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

【问题讨论】:

  • 顺便说一句,将滚动视图放在前面,而不是将图像视图放在后面没有效果,所以它与图像视图在视图堆栈中较低并吃掉了滚动偏移调整
  • 注意:条形必须是半透明的,因此不能将所有内容强制为不透明
  • 你能把完整的源代码发布到 GitHub、Dropbox 或类似的东西上吗?

标签: ios uiscrollview storyboard ios7 autolayout


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

【讨论】:

  • 特别感谢您对automaticAdjustScrollViewInsets 属性问题的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
相关资源
最近更新 更多