【IOS学习之常见问题】UIScrollView 不能滑动(ScrollView has ambiguous scrollable content height)

█ 问题重现:

● UIScrollView 无下拉效果:
   ● 界面布局:
   这里写图片描述
   ● constraint(约束)参数:
   这里写图片描述
   ●  显示界面:
   
这里写图片描述

@property (weak,nonatomic) IBOutlet UIScrollView *ScrollView;
- (void)viewDidLoad {
    [super viewDidLoad];
    self.ScrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height+300);
    //self.ScrollView.scrollEnabled = YES;//有没有,效果一样
    //下拉刷新
    [self.ScrollView addPullToRefreshWithActionHandler:^{
        [self loadData:NO];
    }];
    
    [self loadData:YES];
}

 ● 出现的问题:上下拉,没反应。
 
█ 问题原因:

● 有下拉效果:
 这里写图片描述
 
 这里写图片描述
 ● 有下拉效果:
这里写图片描述

这里写图片描述
 ● 无下拉效果:
  这里写图片描述

这里写图片描述

█ 解决方法:

● UIScrollView 的 ContentSize要大于初始化时的frame的尺寸

self.ScrollView.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height+300);

● UIScrollView 的 ContentSize 尺寸要明确:
 ○ UIScrollView 要和包含的View之间的上下左右距离要明确

█ 最终答案:

 ● 对UIScrollView底部和 View1/View2底部加个距离限制,但是限制不能为0。

█ 相关资料收集:

1.实时显示iOS编写UI代码效果


  一、编写iOS应用UI的方式大概有两种,一种是Storyboard/Xib,另一种是手写代码。

  1.Storyboard/Xib面临一个问题就是多人协作开发,由于所有的UI都放在同一个Storyboard文件中,使用Git/SVN合并代码就会出现冲突。代码复用性比较差

  2.手写UI代码,每次都要编译、构建和运行,最后在模拟器显示,这样会拖慢开发速度。

  二、Auto Layout是一个基于constraint(约束)的布局系统,它根据UI元素之间约束关系来调整UI元素的位置和大小。

  1.更容易适配不同分辨率设备的屏幕(iPhone 6 Plus, iPhone 6, iPhone 5s/5, iPhone 4s/4)。

  2.当设备旋转时不需要做额外处理。

  3.使用constraint来描述布局逻辑,更利于理解和清晰。

  三、Auto Layout在布局view方面是非常强大和灵活,但是创建constraint的语法过于繁杂。

  1.采用Visual Format Language (VFL),虽然语法比较简洁,但是可读性比较差和容易出错。

  2.Masonry是采用链式DSL(Domain-specific language)来封装NSLayoutConstraint,通过这种方式编写Auto Layout布局代码更加易读和简洁。

  

2.ScrollView 与 Autolayout


  看到 Storyboard 错误提示:ScrollView has ambiguous scrollable content height。这是怎么一回事呢?

  UIScrollView 有一个 contentSize 属性,其定义了 ScrollView 可滚动内容的大小。在以前用纯代码写的时候,我们会直接对这个属性赋值,定义其大小。但在 Autolayout 下,UIScrollView 的 contentSize 是由其内容的约束来定义的。因此,我们在 ScrollView 里面设置的约束,不仅起到布局内容的作用,同时也起到了定义 ScrollView 可滚动范围的作用。

  contentSize 的高度是多少?我们缺少一个定义 View 到 ScrollView 底部距离的约束

  

3.UIScrollView不能滚动

UIScrollview手动写的代码,滚动的相关属性都设了,可它就是不能滚动。原来是因为ContentSize跟初始化时的frame都设成了一样大。应该是frame高度要小于ContentSize的。<\p>   

[4.iOS 里 UIScrollView 不能滚动到最下方](https://segmentfault.com/q/1010000000201937) -
  1.UIScrollView 的frame设置有问题, 我设置为屏幕的大小, 所以显示不完全, 应该设置为 中间mainView的高度。
  2.Scrollview的contentSize跟状态栏、导航条、tab条这些控件没有关系。把scrollview想象成一个窗户,窗户的大小是scrollview.frame,窗外世界的大小就是contentSize,世界的大小跟窗台、窗框这些窗户之外的东西大小没关系。
  3.如果你的scrollview滚不到图片的边缘,那么比较大的可能是contentSize设小了,另一种可能就是scrollview的frame设大了,被下面的tabbar挡住了一部分。当然也可能是contentOffset或者contentInset引起的,但估计你没有修改这两个值。
  
转载请注明出处: http://blog.csdn.net/ljb568838953/article/details/78111588
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS 开发中,嵌套在 `UIScrollView` 中的 `UITableView` 在滑动时可能会与 `UIScrollView` 的滑动手势产生冲突,导致无法正常滑动。这个问题可以通过以下两种方式解决: 1. 禁用 `UIScrollView` 的滑动手势 可以通过设置 `UIScrollView` 的 `panGestureRecognizer` 的 `enabled` 属性为 `NO` 来禁用滑动手势,这样就不会与 `UITableView` 的滑动手势产生冲突了。 ```objc scrollView.panGestureRecognizer.enabled = NO; ``` 2. 实现 `UIGestureRecognizerDelegate` 协议的方法 在 `UIViewController` 中实现 `UIGestureRecognizerDelegate` 协议的 `gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:` 方法,可以控制两个手势是否允许同时识别。在这个方法中,可以判断当前的手势是否为 `UIScrollView` 的滑动手势,如果是,则允许与 `UITableView` 的滑动手势同时识别,否则不允许。 ```objc - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([gestureRecognizer.view isKindOfClass:[UIScrollView class]] && [otherGestureRecognizer.view isKindOfClass:[UITableView class]]) { return YES; } return NO; } ``` 需要注意的是,在实现这个方法时,要将 `UIScrollView` 的 `delegate` 设置为当前的 `UIViewController`,否则这个方法不会被调用。 ```objc scrollView.delegate = self; ``` 以上两种方式都可以解决嵌套在 `UIScrollView` 中的 `UITableView` 滑动手势冲突的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值