这两天发现给Scrollview设置contentSize时总是会出现一些问题,楼主苦心专研终于搞懂了Scrollview的contentSize属性该怎么设置了
相信大家在用Scrollview时可能会遇到不知道怎么设置contentSize来达到自己想要的只垂直或者只水平滚动,而有的时候通过设置contentSize.y/x可以,有的时候又不行.这里有一些心得,希望能对你有所帮助
通过一些测试,发现Scrollview的这种情况和ViewController与NavigationController有关.
测试一:这是一段没有导航的代码
[self.view setBackgroundColor:[UIColor grayColor]];
_scrollview = [[UIScrollView alloc] init];
// scrollview设置一个背景色
_scrollview.backgroundColor = [UIColor greenColor];
[_scrollview setBounds:CGRectMake(0, 0, SC_Width, SC_Height)];
_scrollview.pagingEnabled = YES;
[_scrollview setCenter:self.view.center];
// 设置contentSize
_scrollview.contentSize = CGSizeMake(SC_Width*5, SC_Height);
[self.view addSubview:_scrollview];
// 在scrollview上添加几个不同颜色的view
for (int i=0; i<5; i++) {
UIView *scview = [[UIView alloc] initWithFrame:CGRectMake(SC_Width*i, 0, SC_Width, SC_Height)];
[scview setBackgroundColor:[UIColor colorWithRed:arc4random()%11/10.f green:arc4random()%11/10.f blue:arc4random()%11/10.f alpha:1]];
[_scrollview addSubview:scview];
运行结果如下,正常
将contentSize的y设置为0
_scrollview.contentSize = CGSizeMake(SC_Width*5, 0);
得到的结果是和上面一样的,所以在没有nav时,ScrollView的contentSize这两种设置法都可以实现的
测试二:将ViewController加上导航栏
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.window makeKeyAndVisible];
JLRootViewController *rvc = [[JLRootViewController alloc] init];
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:rvc];
[self.window setRootViewController:nvc];
首先将
contentSize的y设置成SC_Height
_scrollview.contentSize = CGSizeMake(SC_Width*5, SC_Height);
测试结果如下图:
可以明显的发现,垂直和水平方向都可以滑动,可以明显的看到两个方向的滚动条
现在我们来将ScrollView的contentSize的y值设成0
_scrollview.contentSize = CGSizeMake(SC_Width*5, 0);
再次测试结果如下图
我们看到将contentSize的y值设成0后,虽然垂直方向不能滚动了(没有垂直滚动条了,只有水平滚动条),但是view的高度貌似变小了,打开Debug View Hierarchy得到如下图
根据上图(绿色的为ScrollView,紫色的为加在ScrollView上的view)发现果然view的高度变小了,为什么会这样,原来是ViewController的一个属性automaticallyAdjustsScrollViewInsets搞得鬼,这是个Bool 的类型,默认是Yes的,这个属性有什么用,查阅苹果的官方文档有下面的一段话:
automaticallyAdjustsScrollViewInsets
Property
A Boolean value that indicates whether the view controller should automatically adjust its scroll view insets.
Declaration
SWIFT
var automaticallyAdjustsScrollViewInsets: Bool
OBJECTIVE-C
@property(nonatomic, assign) BOOL automaticallyAdjustsScrollViewInsets
Discussion
The default value of this property is YES
, which allows the view controller to adjust its scroll view insets in response to the screen areas consumed by the status bar, navigation bar, and toolbar or tab bar. Set to NO
if you want to manage scroll view inset adjustments yourself, such as when there is more than one scroll view in the view hierarchy.
Availability
Available in iOS 7.0 and later.
这里面大概的意思是说这个属性是一个bool类型,它决定它自己(ViewController)中嵌入的ScrollView是否自适应,当这个值默认为yes时,它会使ScrollView自适应由于一些重要的bar的加入(navigation bar, and toolbar or tab bar)导致的屏幕区域不够用的情况(例如,当加入导航栏时,self.view会向下移64个点).设置为NO时你就可以自己去管理你的ScrollView以适应ViewController.
automaticallyAdjustsScrollViewInsets 设置成NO就解决了这个问题了... ...
在原来的代码上加上代码
self.automaticallyAdjustsScrollViewInsets = NO;
运行如下:
运行完美
(再也不怕有各种bar了)