红杏出墙__实训版
2012-05-07 14:13:51| 分类: ios开发 | 标签:ios scrollview |字号大中小 订阅
iPhone/iPad 中 UIScrollView 还是经常要用到的,这里作了一个使用它最简单的例子,一个 ScrollView 中放了三个 UIView。这三个 UIView 分别设置了不同的背景色,它们在 ScrollView 中可以一页一页的滚动。
这段代码放在 UIViewController 的 viewDidLoad 方法中执行的,请注意每个 Frame 和 ScrollView 的关键属性,如 contentSize。ScrollView 中按页滚动时每次走动一个 ScrollView 的宽度(横向时) 或高度(纵向时)。看下面两张图:
第一张图是用属性 contentOffset 设置的第二个 View 为起努 View,中间例如为向左滚动时,默认出现滚动条,第三张图为滚动到了红色面板,注意每个 View 间的缝隙,也是用来作为 View 周围边距的。
上面效果的代码如下,已加上了详细的注释:
不像 UIView 有相应的 UIViewController,UIScrollView 没有相对应的 UIScrollViewController,但 UIScrollView 也有事件,只是您需要自己来指定 UIScrollView 的 Delegate 才行,这个 Delegate 要应用协议 UIScrollViewDelegate 的方法。
关于 ScrollView 的一些属性可以在 Xcode 代码提示中看到,也可以在 Interface Builder 中看到,以及每一个属性的默认取值是什么也一目发然,如下图为 Xib 中某个 ScrollView 的属性面板:
参考:1. UIScrollView 原理详解
本文链接 http://unmi.cc/use-uiscrollview, 来自 隔叶黄莺 Unmi Blog
参考贴2:
实现带预览和分页的图片浏览功能, 类似AppStore详情页标题可能有点让人看不懂, 的确, 我实在很难抽象出一个好的标题, 下面我来详细描述下场景.
当我们打开AppStore, 点击进入详细应用页面时, 可以看到App的截图, 左边和右边分别可以看到相邻图片的一部分, 看似实现起来比较简单, 使用UIScrollView就可以了, 但是如果设置了UIScrollView的pagingEnabled, 就需要多考虑下了.
1. 首先要考虑UIScrollView的width值是多少.
当UIScrollView的pagingEnabled为YES时, 每次自动滚动UIScrollView本身的宽度(我们要实现的是横向滚动), 我们需要让每次滚动结束之后一个图片在中间的位置. 看下边我标记过的截图(其实我是个海贼控, 嗯.).
UIScrollView的width值应该为z, 一次分页滚动后可以剩余x个像素宽度可见. 假设我们要显示的图片宽度为224, 每个图片间隔为20, 则
x + y = 224
z = x + y + 20= 244, z就是UIScrollView的宽度.
把UIScrollView居中放置, 通过设置clipsToBounds让超出UIScrollView的部分显示出来.
这样基本效果就出来了, 但是有一个问题, 超出UIScrollView的部分虽然可见了, 但是不可以通过这部分滑动UIScrollView.
2. 解决超出UIScrollView部分不触发滑动的问题.
解决这个的办法是利用UIView的 – hitTest:withEvent: 方法. 首先重写一个类继承自UIView, 滚动图片的UIScrollView放在这个自定义的view上, 重写UIView的 – hitTest:withEvent:
{
return _scrollView; //把所有事件都交给UIScrollView来处理, 这样超出UIScrollView的部分也可以触发滑动了.
}
这样所有的功能就都实现了, 代码我已经提交到了github.com, 需要完整代码的点击这里.
第二篇确实给了很大的帮助,转载后谢谢博主
项目中需要在listview中添加footview 出现了两个问题
1.footview点击报错 空指针 好解决 在itemclickListener中判断位置即可
2.footview本应隐藏消失的 却显示了分隔线 在stackoverflow发现下面这段话 一下发现了解决办法
Instead you need to call the addFooterView(View v, Object data, boolean isSelectable) method with isSelectable set to true. You can just pass null for the data object if you don't need it.
当初加footview时就没注意还有一个方法 上面那段话大意是listview从来不会主动的加入分隔线 只当内容可以点击时才会加上
所以在加入footview时设置为不可选即可 可以同时解决上面2个问题
还有一种情况下 如果没有设置adapter的情况加载了footView 此时调用
listView.removeFooterView(footView);
会报空指针 但实际上listview和footview都不为空 解决方法是
设置adapter以后再进行removeFooterView的操作 再没有报空的问题