关于Scrollview怎么只让一个方向滚动的问题

 

 这两天发现给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的,这个属性有什么用,查阅苹果的官方文档有下面的一段话:

A Boolean value that indicates whether the view controller should automatically adjust its scroll view insets.

Declaration

SWIFT

var automaticallyAdjustsScrollViewInsetsBool

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.


  好了,问题解决了,只要在代码中ViewController的automaticallyAdjustsScrollViewInsets 设置成NO就解决了这个问题了... ...

在原来的代码上加上代码

self.automaticallyAdjustsScrollViewInsets = NO;
运行如下:



运行完美大笑大笑大笑大笑大笑(再也不怕有各种bar了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值