2013-10-16 188 views
0

我在故事板的工作,在Xcode 5.0.1下方观察不工作,使应用程序适用于iOS 7调整滚动视图缩进,如果有滚动视图

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

正确滚动查看并正确滚动,并在调整滚动视图插图启用时在顶部和底部条形图下正确滚动。

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

如果我将视图放在故事板中,或者在ViewDidLoad或ViewWillAppear中执行该程序,或者如果我将它放在故事板中的较高点,然后以编程方式将其移回到后面,则无关紧要,我得到了相同的结果,滚动不调整为酒吧。

如果我在viewDidAppear中加载或移动它,那么它就可以工作,但是对于我的转换来说已经太晚了,我需要在背景开始变得可见时看到视图。

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

+0

因此,将滚动视图置于前面,而不是将图像视图发送到后面没有任何效果,因此它与视图堆栈中较低的图像视图有关并且正在进行滚动偏移调整 – ima747

+0

注意:酒吧必须是半透明的,所以强迫一切不透明不是一种选择 – ima747

+0

你可以发布一个完整的源代码到GitHub,Dropbox或类似的东西吗? –

回答

1

我面临同样的问题,解决方案并不简单。我所做的是UIScrollView的子类,添加一个带图像的子图层并将其与滚动一起移动。我确信有更好的方法来做我所做的,但它的工作原理。

这是ScrollViewWithBackgroundImage.m。我没有使用arc,如果是的话,只需删除dealloc方法并用'strong'改变'retain'即可。另外,如果您尚未执行此操作,则需要添加#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属性将只在滚动工作视图是堆栈中的第一个子视图。您可以将滚动视图嵌入到视图中,只要滚动视图位于堆栈的底部(位于界面构建器的顶部),该视图仍然可以工作。每当您添加滚动视图下方的另一个子视图时,自动插入调整将停止工作。

+0

特别感谢您澄清automaticAdjustScrollViewInsets属性问题。 – ima747