[英]Adjust scroll view indents doesn't work if there is a view below the scrollview
我正在Xcode 5.0.1的情节提要中制作一个适用于iOS 7的应用程序。
我有一个带有滚动视图的视图控制器,该视图显示在导航控制器内部,底部带有工具栏。
滚动视图可以正确插入,并在启用“调整滚动视图插入”的情况下在顶部和底部栏下正确滚动。
我想添加一个不会在滚动视图后面滚动的背景图像。 当我这样做时,就好像未选中Adjusts Scroll View Insets标志一样,滚动条和内容始终位于顶部和底部。
不管是将视图放入情节提要中,还是将其以编程方式在ViewDidLoad或ViewWillAppear中进行设置,还是将其放在情节提要中的较高位置,然后以编程方式将其移回至后面,都可以同样的结果,滚动条不调整条形。
如果我将其加载或移动到viewDidAppear中,则它可以正常工作,但是对于我的过渡来说为时已晚,我需要在它开始变得可见时在后台显示该视图。
我怀疑这是ios7的错误,是否有任何已知的解决方法?
我遇到了同样的问题,解决方案并不简单。 我所做的是将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
属性才会起作用。 您可以将滚动视图嵌入视图中,只要滚动视图在堆栈的底部(在界面构建器的顶部),它仍将起作用。 每当您在滚动视图下方添加另一个子视图时,自动插入调整将停止工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.