UIScrollerview的contentsize设置

  最近被同行的一个朋友问到一个问题“UIScrollerview上添加子控件,给子控件约束好布局之后,还需要给scrollerview重新设置contentsize吗?”于是想到了我自己曾经着手的一个项目,有一个界面就用到了scrollerView,里面添加了子控件,我记得当时scrollerView的frame和屏幕的一样,contensize最后是在里面的子控件布局结束之后重新设置的,所以我的回答是需要设置呀。可是最后,那个朋友就告我让我回去再试试,说是不需要设置的,还说可能是我和他那边的需求不一样我的才需要重新设置contentsize。最后自己就试了试,整理如下。

  首先用storyboard创建一个UIScrollerview到当前view上,设置好上下左右的间距,更新布局,这时候肯定是没有问题的,正常显示。之后又放一个UIImageview到scrollerView上,上下左右到scrollerView的间距,更新约束,这时候却显示布局报错,按理说正常的控件这时就可以正常工作吧。问题的关键在于如何给scrollView内部的子控件添加完整约束.scrollView内部子控件约束的添加需要遵循两个原则:

1、scrollView内部子控件的尺寸不能以scrollView的尺寸为参照
2、scrollView内部的子控件的约束必须完整

首先,子控件的尺寸不能以scrollView的尺寸为参照,那么我们有两种选择:

  • 提供一个具体值的约束(比如200)
  • 子控件的尺寸可以参照scrollView以外其它的控件的尺寸(如控制器的view的尺寸)

其次,约束"完整"的意思是说:子控件在水平及竖直方向上的约束要把scrollView"撑满".

也就是说,在水平方向上,我们需要设置:

  • 子控件左侧与父控件的距离
  • 子控件自身的宽度
  • 子控件右侧距父控件的距离.

竖直方向上也一样,要设置:

  • 子控件顶部距父控件的距离
  • 子控件的高度
  • 子控件底部距父控件的距离.

上面我的问题就在于没有设置UIImageView的尺寸。

为什么scrollView如此特殊呢?

这是因为,scrollView需要根据添加在其内部的子控件的宽高及与四周的距离计算出它的contentSize.

例如:
一个添加在scrollView内部的imageView的宽高为{80, 50}, imageView距离上左下右的距离分别为:100, 200, 300, 400,那么不需要用代码赋值contentSize,我们就可以打印出scrollView的contentSize为{680, 450}.
如图:

也就是说,子控件的约束决定了container的尺寸(contentSize).

这里自己用storyboard亲测是可以的,压根不需要设置contentsize;然而在用我自己常用的布局框架SDAutolayout却发现了问题,contentsize始终为最初的屏幕大小,最后又用布局框架Masonry试了一遍,这时候却是可以的,好吧,到这里我只能说,SDAutolayout原来还有这个问题,我原来的项目scrollerView布局正好用的SDAutolayout,真的坑死我了,明明是此布局框架的问题,请注意了!!

原帖:http://blog.csdn.net/u014795020/article/details/51893943

时间: 2024-11-04 19:07:50

UIScrollerview的contentsize设置的相关文章

Cocos2d-x 3.2 大富翁游戏项目开发-第四部分 退出对话框

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">这部分代码从网上查阅了一下,基本都是以前版本编写的,需要稍微改动一下即可,效果如图</span> 首先看看在MenuScene.cpp如是如何调用起对话框的 void MenuScene::popupLayer(){ // 定义一个弹出层,传入一张背景图 PopupLayer

新浪微博客户端(9)-实现版本新特性的ViewPager

"DJNewFeatureViewController.m" #import "DJNewFeatureViewController.h" #define NEW_FEATURE_NUMS 4 @interface DJNewFeatureViewController() <UIScrollViewDelegate> @property (nonatomic,weak) UIPageControl *pageControl; @end @implemen

UI整理-----part4--UIScrollView

(1)UIScrollView可以用于显示多于一个屏幕的内容,超出屏幕范围的内容可以通过滑动进行查看. (2)常见属性: @property(nonatomic)CGPoint contentOffset;            UIScrollView当前滚动位置 @property(nonatomic)CGSize contentSize;           设置内容尺寸大小 @property(nonatomic)UIEdgeInsets contentInset;          

UIKit - scroll View缩放、滚动

UIScrollView滚动 三大属性: self.scrollView.pageEnabled = NO  是否分页:n只要将UIScrollView的pageEnabled属性设置为YES,UIScrollView会被分割成多个独立页面,里面的内容就能进行分页展示 contentSize    设置的是要展示的内容的大小  size(如果小于scrollView的frame将无法滚动) contentInset  是在contentSize的基础上额外增加的滚动区域 //self.scrol

cocos代码研究(1)Node学习笔记

理论部分 Node类继承自Ref类,是cocos框架中基础底层的一个封装类,与画面渲染相关的类一般都是继承自该类,例如Scene,Layer,Sprite,Sprite3D,Label,SpriteBatchNode,MenuItem,ClippingNode,DrawNode,ParticleBatchNode, ParticleSystem等都是继承自Node类. 代码部分 父子节点关系API virtual void addChild (Node *child)添加一个子节点到容器内,z-

你真的了解UIScrollView吗?

一:首先查看一下关于UIScrollView的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIScrollView : UIView <NSCoding> //表示UIScrollView滚动的位置(就是内容左上角与scrollView左上角的间距!!) @property(nonatomic) CGPoint contentOffset; // default CGPointZero //表示UIScrollView内容的尺寸,滚动范围 @proper

iOS开源加密相册Agony的实现(六)

简介 虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制.本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目).WiFi传图.照片文件加密等功能.目前项目和文章会同时前进,项目的源代码可以在github上下载. 点击前往GitHub 概述 上一篇文章主要介绍了照片的保存.删除批处理的实现.这篇文章将介绍图片浏览器原图浏览.缩放和滑动切换图片的实现细节. 图片缩放的实现 总体说明 可以利用UIScrollView的

UINavigationController (导航控制器)

内存管理修饰: copy:NSString,block copy:将对象的拷贝赋给引用,拷贝完的是不可变的. 为什么用copy? NSString类型的特点就是内容不可变的,但是给NSString赋值时,可以将NSMutableString赋过来,可能就会有其他持有MutableString的引用修改了这个字符串,结果你再用NSString访问字符串时就会发现,本来不可变的字符串在不知情的情况下被改变了.所以为了避免这种情况,就是用copy将内容复制成不可变之后再给NSString 使用copy

移动开发(IOS) – UIKit框架

1.UIView 1.1.所有 UI 控件都继承自 UIView. 1.2.每一个 UIView 都是一个容器,可以容纳其他 UIView.其中容器视图被称为父视图,而被包含的视图或者控件被成为子视图或者子控件. 1.3.视图对应的文件通常是 storyboard 或者 xib 文件.在许多 iOS 应用程序中,通常不必为视图编写任何代码. 1.4.UIView 负责界面的显示. 1.5.常用属性: superview 获得自己的父控件对象 subviews 获得自己的所有子控件对象 一个视图最