• 作为一个资深(自认为)iOS程序猿,会经常用到轮播图,但是总是感觉自己实现要比直接用别人的要方便一点,...通过更改数据源来给用户一个假象,图片在无限滚动(其实一共只有3个 cell),默认显示第一个,右滑 index +

    作为一个资深(自认为)iOS程序猿,会经常用到轮播图,但是总是感觉自己实现要比直接用别人的要方便一点,并且有一些需求需要深度定制,于是想着自己封装一个可以定制化的轮播图库JCyclePictureView

    GitHub地址

    1、核心代码


    数据处理

    通过更改数据源来给用户一个假象,图片在无限滚动(其实一共只有3个 cell),默认显示第一个,右滑 index + 1, 左滑 index - 1,然后修改数据源,异步回到第一个cell(注意不能有动画)


     滑动事件

    2、可定制 cell


    深度定制 cell

    自定义 cell 的回调

    本质为UICollectionView 的cellForItemAt 代理,需自己实现赋值逻辑


    cellForItemAt

    3、滚动方向


    轮播图滚动方向

    支持 上下左右 四种滚动方式


    定时器事件

    实际为 UICollectionView 用动画滚动到 第0个 cell 还是第2个 cell


    UICollectionView动画

    4、PageControl

    为实现可支持图片的PageControl,写了一个继承UIPageControl 的 JPageControl


    JPageControl

    红框内为核心代码,原理其实很简单,在每一个 显示的点上面添加一张图片,然后根据 currentPage 属性修改图片


    JPageControl对齐方式

    目前对齐方式支持 left、center、right,通过修改 frame 确定位置

    5、其它需求


    init方法

    pictures 可以之后设置  pictures支持本地、网络图片同时加载


    轮播图标题

    设置标题时 PageControl 自动右对齐


    点击图片回调

    index 从0 开始


    自动播放时间

    小于0.5秒不自动播放(如果不想自动播放可以 设为 0)


    图片的ContentMode

    设置图片的ContentMode

    6、用法


    用法

    自定义 cell

    如果使用过程中出现问题,可随时 mr_banma@126.com 邮件联系。

    ps:如果喜欢,记得 Star 一下,谢谢支持 

    源码 

    展开全文
  • 手机作为一个小屏设备,需要显示的信息往往无法在一个屏幕上显示,此时就需要使用到滚动条,当然除了像TableView这样可以自带滚动功能的。如果一个界面上View较多,那就必须要使用到ScrollView了。现在我们将会使用...

           手机作为一个小屏设备,需要显示的信息往往无法在一个屏幕上显示,此时就需要使用到滚动条,当然除了像TableView这样可以自带滚动功能的。如果一个界面上View较多,那就必须要使用到ScrollView了。现在我们将会使用Swift在iOS上实现滚动效果。具体实现如下:

    (1)创建一个新的iOS项目,语言选择Swift,并在Main.storyboard中拖入一个ScrollView控件。然后在ScrollView中拖入几张照片,等下可以使用滚动功能查看照片,界面如下:


    (2)把ScrollView和几个ImageView拖拽与代码进行Outlet绑定,绑定后代码如下:

        @IBOutlet weak var homepageScrollView: UIScrollView!  //这个是滚动条;
        @IBOutlet weak var image1: UIImageView!
        @IBOutlet weak var image2: UIImageView!
        @IBOutlet weak var image3: UIImageView!
        

    (3)然后在viewDidLoad()方法中实现 滚动条的代码,注意如下contentSize的使用,必须设置ScrollView的内容大小,界面才会有滚动效果,并且这个大小是可以自己任意输入的,你设置多大的长和宽,整个ScrollView就像画布,这个画布的大小就是多大,然后由于屏幕较小,只能显示一部分,所以你就可以通过滑动查看其他未见的部分。

        override func viewDidLoad() {
            super.viewDidLoad()
    
            //在滚动条中增加View;
            homepageScrollView.addSubview(image1)//不断在ScrollView中添加子控件;
            homepageScrollView.addSubview(image2)
            homepageScrollView.addSubview(image3)
    
            homepageScrollView.contentSize=CGSize(width: image1.bounds.size.width, height: image1.bounds.size.height+image2.bounds.size.height+image3.bounds.size.height+500)
            //注意要添加所有控件的高度到ScrollView中;也可以自定义长和宽;
            
        }

    (4)运行程序,查看结果。



    (5)可能会有人有疑问,我上面的图片都是直接添加到storyboard中的,都是写死的,我现在通过代码动态增加一张图片,并且添加到ScrollView中。以此来真正实现滚动条的功能;

    动态显示图片代码:

            //这里的“image4”是通过代码动态添加的,而不是在storyboard中写死的,加在image3下面;
            var imageView:UIImage = UIImage(named: "gallery4")!
            //gallery4是这张图片的名字,不需要扩展名;
            var image4:UIImageView = UIImageView(frame: CGRect(origin: CGPoint(x: 0,y: image1.bounds.size.height+image2.bounds.size.height+image3.bounds.size.height), 
    size: image1.bounds.size))
            //设置这张图片的显示位置和大小,原图较大,我设置为和image1大小一样;
            image4.image = imageView

    继续在ScrollView中增加这个View:

     homepageScrollView.addSubview(image4)

    最后别忘了在contentSize中增加相应的长度:

    homepageScrollView.contentSize=CGSize(width: image1.bounds.size.width, height: image1.bounds.size.height+image2.bounds.size.height+image3.bounds.size.height+
    image4.bounds.size.height+500)//注意要添加所有控件的高度到ScrollView中;也可以自定义长和宽;

    所以最后整个类中的代码如下:

    class HomepageViewController: UIViewController,UIScrollViewDelegate{    //注意要实现这个Delegate委托;
        
        
        @IBOutlet weak var homepageScrollView: UIScrollView!  //这个是滚动条;
        @IBOutlet weak var image1: UIImageView!
        @IBOutlet weak var image2: UIImageView!
        @IBOutlet weak var image3: UIImageView!
        
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //这里的“image4”是通过代码动态添加的,而不是在storyboard中写死的,加在image3下面;
            var imageView:UIImage = UIImage(named: "gallery4")!
            //gallery4是这张图片的名字,不需要扩展名;
            var image4:UIImageView = UIImageView(frame: CGRect(origin: CGPoint(x: 0,y: image1.bounds.size.height+image2.bounds.size.height+image3.bounds.size.height), 
    size: image1.bounds.size))
            //设置这张图片的显示位置和大小,原图较大,我设置为和image1大小一样;
            image4.image = imageView
            
            //在滚动条中增加View;
            homepageScrollView.addSubview(image1)//不断在ScrollView中添加子控件;
            homepageScrollView.addSubview(image2)
            homepageScrollView.addSubview(image3)
                homepageScrollView.addSubview(image4)
    
            homepageScrollView.contentSize=CGSize(width: image1.bounds.size.width, height: image1.bounds.size.height+image2.bounds.size.height+image3.bounds.size.height+
    image4.bounds.size.height+500)//注意要添加所有控件的高度到ScrollView中;也可以自定义长和宽;
            
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
            ///////////////////////////////////////////
        }
    
    }
    

    (6)最后运行结果如下:



         其实ScrollView滚动条还有很多其他的属性设置和特性,有一部分也可以在storyboard中进行设置,是博大精深的,我们以后在开发中在慢慢学习。



    github主页:https://github.com/chenyufeng1991  。欢迎大家访问!






    展开全文
  • 之前用OC写了UIScrollView,这次用Swift写的,写的不好多担待,O(∩_∩)O~ //先签一下协议 class ViewController: UIViewController , UIScrollViewDelegate { //Swift没有宏定义,只好定义常量来代替宏定义 let SCRO

    之前用OC写了UIScrollView,这次用Swift写的,写的不好多担待,O(∩_∩)O~

                                            //先签一下协议
    class ViewController: UIViewController , UIScrollViewDelegate {
        //Swift没有宏定义,只好定义常量来代替宏定义
        let SCROLL_WIDTH = UIScreen.mainScreen().bounds.width
        let SCROLL_HEIGHT = UIScreen.mainScreen().bounds.height
    
        var scrollView :UIScrollView?     //轮播图
        var pageC :UIPageControl?         //小点
        var timer :NSTimer?               //定时器
        var scArray :NSMutableArray?      //图片数组
    override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
            //图片数组
            scArray = ["5.jpg","0.jpg","1.jpg","2.jpg","3.jpg","4.jpg","5.jpg","0.jpg"]
    
            //初始化轮播图
            scrollView = UIScrollView.init(frame: UIScreen.mainScreen().bounds)
            //ScrollView背景颜色
            scrollView?.backgroundColor = UIColor.cyanColor()
            //ScrollView滚动量
            scrollView?.contentSize = CGSizeMake(SCROLL_WIDTH * CGFloat((scArray?.count)!), SCROLL_HEIGHT)
            //ScrollView偏移量
            scrollView?.contentOffset = CGPointMake(SCROLL_WIDTH, 0)
            //是否按页滚动
            scrollView?.pagingEnabled = true
            //是否显示水平滑条
            scrollView?.showsHorizontalScrollIndicator = false
            //协议
            scrollView?.delegate = self
            self.view.addSubview(scrollView!)
    
            //遍历图片数组
            for var i = 0 ; i < scArray?.count ; i++ {
    
                let str :String = (scArray?.objectAtIndex(i))! as! String
                let img = UIImage(named: str)
                //初始化imageView
                let imgV :UIImageView = UIImageView()
                //添加图片
                imgV.image = img
                imgV.backgroundColor = UIColor.lightGrayColor()
                //设置图片位置及大小
                imgV.frame = CGRectMake((CGFloat(i) * SCROLL_WIDTH),0, SCROLL_WIDTH, SCROLL_HEIGHT)
                scrollView?.addSubview(imgV)
    
                //轻拍手势
                let tap = UITapGestureRecognizer.init(target: self, action: "tapImageV:")
                imgV.tag = 1000 + i
                //打开用户交互
                imgV.userInteractionEnabled = true
                //给图片添加轻拍手势
                imgV.addGestureRecognizer(tap)
    
            }
    
            //设置小点的位置大小
            pageC = UIPageControl.init(frame: CGRectMake((SCROLL_WIDTH - 200) / 2, SCROLL_HEIGHT - 50, 200, 50))
            //设置小点背景色
            pageC?.backgroundColor = UIColor.clearColor()
            //设置小点个数
            pageC?.numberOfPages = (scArray?.count)! - 2
            //设置小点当前页码颜色
            pageC?.currentPageIndicatorTintColor = UIColor.whiteColor()
            //设置小点未选中页码颜色
            pageC?.pageIndicatorTintColor = UIColor.grayColor()
            //设置当前选中页
            pageC?.currentPage = 0
            self.view.addSubview(pageC!)
    
            timer = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: "change:", userInfo: nil, repeats: true)
    
        }
        //循环滚动方法
        func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
            //如果图片在第一张的位置
            if scrollView.contentOffset.x == 0 {
                //就变到倒数第二张的位置上
                scrollView.scrollRectToVisible(CGRectMake(scrollView.contentSize.width - 2 * SCROLL_WIDTH,0,SCROLL_WIDTH,SCROLL_HEIGHT), animated: false)
                //如果图片是倒数第一张的位置
            } else if scrollView.contentOffset.x == scrollView.contentSize.width - SCROLL_WIDTH {
                //就变到第二张的位置
                scrollView .scrollRectToVisible(CGRectMake(SCROLL_WIDTH, 0, SCROLL_WIDTH, SCROLL_HEIGHT), animated: false)
            }
    
            pageC?.currentPage = Int(scrollView.contentOffset.x / SCROLL_WIDTH) - 1
    
        }
    
    //定时器执行方法
        func change(timer :NSTimer) {
    
            if pageC?.currentPage == (pageC?.numberOfPages)! - 1 {
                pageC?.currentPage = 0
            } else if (pageC?.currentPage)! < (pageC?.numberOfPages)! - 1 {
                pageC?.currentPage++
            }
            scrollView?.setContentOffset(CGPointMake((CGFloat(pageC!.currentPage + 1)) * SCROLL_WIDTH, 0), animated: false)
        }
    
        //开启定时器
        func addTimer() {
            timer = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: "change:", userInfo: nil, repeats: true)
        }
    
        //关闭定时器
        func removeTimer() {
            timer?.invalidate()
        }
    
        //开始拖拽时调用
        func scrollViewWillBeginDragging(scrollView: UIScrollView) {
            //关闭定时器
            removeTimer()
        }
    
        //拖拽结束后调用
        func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
            //开启定时器
            addTimer()
        }
        //轻拍事件
        func tapImageV(tap :UITapGestureRecognizer) {
    
            print((tap.view?.tag)! - 1001)
    
        }
    展开全文
  • swift实现网络图片滚动(滑动) 以下代码片段 func scrollViewDidEndDecelerating(scrollView: UIScrollView) { println("滑动") var currentPage = self.scrollView.contentOffset.x/375 println(currentPage) if ...
  • 滚动公告、广告,支持灵活自定义cell。模仿淘宝头条等等这类滚动广告 Roll Notice Advertising
  • scrollText 滚动文字,文字滚动,一句代码实现,传入字符串即可
  • UITableView嵌套滚动框架,swift3.0实现,简单易用,快速集成类似两个tableView嵌套滚动需求
  • CycleLabel循环滚动的label控件
  • 1,当图片尺寸超过屏幕时,使用UIScrollView可以实现滚动条视图,即手指触摸滚动屏幕方便浏览整个页面。 1 2 3 4 5 6 let scrollView=UIScrollView() scrollView.frame=...
    1,当图片尺寸超过屏幕时,使用UIScrollView可以实现滚动条视图,即手指触摸滚动屏幕方便浏览整个页面。
    1
    2
    3
    4
    5
    6
    let scrollView=UIScrollView()
    scrollView.frame=self.view.bounds
    let imageView=UIImageView(image:UIImage(named:"bigpic"))
    scrollView.contentSize=imageView.bounds.size;
    scrollView.addSubview(imageView);
    self.view.addSubview(scrollView)

    2,获取滚动视图移动的x,y坐标
    通过scrollView.contentOffset.x与scrollView.contentOffset.y我们可以取到移动的偏移位置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import UIKit
     
    class ViewControllerUIViewController,UIScrollViewDelegate {
         
        var scrollView:UIScrollView!
         
        override func viewDidLoad() {
            super.viewDidLoad()
             
            scrollView=UIScrollView()
            //设置代理
            scrollView.delegate = self
            scrollView.frame=self.view.bounds
            let imageView=UIImageView(image:UIImage(named:"ii"))
            scrollView.contentSize=imageView.bounds.size;
            scrollView.addSubview(imageView);
            self.view.addSubview(scrollView)
        }
         
        //视图滚动中一直触发
        func scrollViewDidScroll(scrollView: UIScrollView) {
            print("x:\(scrollView.contentOffset.x) y:\(scrollView.contentOffset.y)")
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }

    3,手势放大缩小
    要实现放大缩小功能,需要指定UIScrollView的允许缩放最大比例和最小比例(默认都是是1.0)。
    同时delegate属性指定一个委托类,委托类要继承UIScrollViewDelegate协议,并在委托类中实现viewForZoomingInScrollView方法。
    (注:在模拟器中测试,需要按住option键再拖动内容)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    scrollView.minimumZoomScale=0.1 //最小比例
    scrollView.maximumZoomScale=3 //最大比例
    scrollView.delegate=self
     
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        for subview : AnyObject in scrollView.subviews {
            if subview.isKindOfClass(UIImageView) {
                return subview asUIView
            }
        }
        return nil
    }
    UIScrollView提供了以页面为单位滚动显示各个子页面内容的功能,每次手指滑动后会滚动一屏的内容。
     

    要实现该功能,需要如下操作:
    1,将UIScrollView的 pagingEnabled 属性设置成true
    2,必须通过 contentSize 属性设置各个页面相加的宽度。比如iphone手机一屏宽度是320,如果有3个页面,则contentSize就需要设置为320*3=960
    3,最好将 showsHorizontalScrollIndicator 和 showsVerticalScrollIndicator 设置成 false 隐藏横向和纵向滚动条。
    4,如果 scrollsToTop 不需要也设置成false

    --- 主页面 ---
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import UIKit
     
    class ViewControllerUIViewController{
        let numOfPages = 3
        let pageWidth = 320
        let pageHeight = 360
         
        override func viewDidLoad(){
            super.viewDidLoad()
             
            //scrollView的初始化
            let scrollView = UIScrollView()
            scrollView.frame = self.view.bounds
            //为了让内容横向滚动,设置横向内容宽度为3个页面的宽度总和
            scrollView.contentSize=CGSizeMake(CGFloat(pageWidth*numOfPages),
                CGFloat(pageHeight))
            scrollView.pagingEnabled = true
            scrollView.showsHorizontalScrollIndicator = false
            scrollView.showsVerticalScrollIndicator = false
            scrollView.scrollsToTop = false
             
            //添加子页面
            for in 0..<numOfPages{
                let myViewController = MyViewController(number:(i+1))
                myViewController.view.frame = CGRectMake(CGFloat(pageWidth*i),
                    CGFloat(0), CGFloat(pageWidth), CGFloat(pageHeight))
                scrollView.addSubview(myViewController.view)
     
            }
            self.view.addSubview(scrollView)
        }
    }

    --- 子页面 ---
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import UIKit
     
    class MyViewControllerUIViewController{
        var number:Int!
        let colorMap=[
            1:UIColor.blackColor(),
            2:UIColor.orangeColor(),
            3:UIColor.blueColor()
        ]
         
        init(number initNumber:Int){
            self.number = initNumber
            super.init(nibName:nil, bundle:nil)
        }
         
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
         
        override func viewDidLoad(){
            let numberLabel = UILabel(frame:CGRectMake(130,50,50,30))
            numberLabel.text = "第\(number)页"
            numberLabel.textColor = UIColor.whiteColor()
            self.view.addSubview(numberLabel)
            self.view.backgroundColor = colorMap[number]
        }
    }


    展开全文
  • Swift 标题滚动视图布局样式
  • SWIFT控件之滚动视图

    2016-02-27 15:51:19
    1、滚动视图属性 属性 功能 contentOffSet 滚动视图目前滚动的位置 contentSize 滚动范围的大小 contentInset 其他视图在滚动视图中的位置 delegate

    1、滚动视图属性

    属性                                功能
    contentOffSet                滚动视图目前滚动的位置
    contentSize                   滚动范围的大小
    contentInset                   其他视图在滚动视图中的位置
    delegate                        设置委托
    directionalLockEnabled  指定滚动视图是否只能在一个方向上滚动
    bounces                        指定滚动视图遇到边框后是否反弹
    alwaysBounceVertical  指定垂直方向遇到边框是否反弹
    alwaysBounceHorizontal  指定水平方向遇到边框是否反弹
    pagingEnabled            是否能滚动
    scrollEnabled               滚动视图是否整页翻动
    showsHorizontalScrollIndicator  是否显示水平方向的滚动条
    showsVerticalScrollIndicator  是否显示垂直方向的滚动条
    scrollIndicatorInsets     指定滚动条在滚动视图中的位置
    indicatorStyle                设定滚动条的样式
    minimumZoomScale   缩小的最小比例
    maximumZoomScale  放大的最大比例
    zoomScale                   设置变化比例
    bouncesZoom              指定缩放的时候是否会反弹

    2、滚动视图事件

    事件                                         功能
    scrollViewDidScroll(_:)       已经滑动
    scrollViewWillBeginDragging(_:)                     开始拖动
    scrollViewDidEndDragging(_:willDecelerate:)                结束拖动
    scrollViewShouldScrollToTop(_:)             是否支持滑动至顶部
    scrollViewDidScrollToTop(_:)               滑动到顶部时调用该方法
    scrollViewWillBeginDecelerating(_:)             开始减速
    scrollViewDidEndDecelerating(_:)                减速停止
    viewForZoomingInScrollView(_:)                   返回一个放大或者缩小的视图
    scrollViewWillBeginZooming(_:withView:)  开始放大或者缩小
    scrollViewDidEndZooming(_:withView:atScale:)  缩放结束时
    scrollViewDidZoom(_:)                                    视图已经放大或缩小

    展开全文
  • 滚动一定要在tableView.reloadData()之后进行 1. 默认plain 模式 办法1. tableView.contentOffset.y = 0 办法2 tableView.scrollToRow(at: IndexPath(item: 0, section: 0), at: UITableViewScrollPosition....
  • 语言版本:swift4.2 工作中,很容易碰到跑马灯效果,网上的感觉都不怎么满意,就自己封装了个。 注意:一个时,会自动生成多个相同的循环播放 优点:支持autolayout布局、不仅限于label展示、宽度缓存处理、视图...
  • 重构版--特斯拉组件、多页面嵌套滚动、悬停效果、美团、淘宝、京东、微博、腾讯新闻、网易新闻、今日头条等标题滚动视图
  • 用 UICollectionView 写的无限滚动轮播图,支持自定义 cell、滚动方向等
  • Swift滚动视图

    2018-11-16 11:55:30
    var View:UIView? var scroll:UIScrollView? var page:UIPageControl? var imgV:UIImageView? var timer:Timer? var k:Int = 0 override func viewDidLoad() { super.viewDidLoad() ...ScrollView()//滚动视图 ...
  • 滚动公告、广告,支持灵活自定义cell。模仿淘宝头条等等这类滚动广告
  • iOS开发中,实现UILabel滚动,类似于跑马灯效果;
  • swift封装类似新闻标题的滚动
1 2 3 4 5 ... 20
收藏数 5,776
精华内容 2,310
热门标签