精华内容
下载资源
问答
  • 主要介绍了Android使用viewpager实现自动无限轮播图效果,实现方法大概有两种,一种是viewpager+作为游标的点 。另外一种是重写viewpager,具体实现过程大家参考下本
  • 使用collectionView制作的无限轮播图, 下面是Demo,GitHub: https://github.com/Super-lying/LyScrollBanner 简单使用方法 CGRect rect1 = CGRectMake(0, 300, 320, 220); NSArray *arrHttp = @[@...
  • ios-无限轮播图.zip

    2019-07-11 18:51:50
    一行代码实现无限轮播,简单方便,可以直接使用。
  • 用RecyclerView实现完美的无限轮播图,3D效果和普通效果,支持自定义你的指示器哦,支持一屏三页效果哦,支持上下滑动的banner哦
  • jQuery响应式无限轮播图片代码是一款可以自动将图片居中对齐,组成首尾相接的一组图片,通过导航按钮或移动触摸滑动来前后切换图片
  • 用RecyclerView实现无限轮播图,有普通版和3d版
  • 无限轮播图

    2015-12-21 09:05:50
    实现了UISCrollView的无限轮滚
  • jQuery响应式无限轮播图片代码是一款可以自动将图片居中对齐,组成首尾相接的一组图片,通过导航按钮或移动触摸滑动来前后切换图片
  • 本文主要介绍了原生js实现无限循环轮播图效果的示例代码。具有很好的参考价值,下面跟着小编一起来看下吧
  • 无限轮播图片

    2016-03-23 13:56:09
    无限轮播,很简单,很好用
  • 最简单的无限轮播图

    2018-01-02 11:47:32
    本demo是用最简单的逻辑,最简单的代码,最简单的方式,让无限轮播图最简单的呈现在我们眼前,本人对它的评价是“简单暴力”
  • jQuery响应式无限轮播图片代码是一款可以自动将图片居中对齐,组成首尾相接的一组图片,通过导航按钮或移动触摸滑动来前后切换图片
  • 使用三张图片实现无限轮播图功能,使用到了重用功能
  • Android无限轮播图片

    2015-12-08 11:32:02
    无限轮播图片,到处可见,但有的需要改动太大,有的轮播最后一张,过度不自然,有的是设置max_value,这个才是真的无限录播,使用跳转的方式!最后的动画也经过精心测试,达到自然动画过度!只需把这个自定义控件...
  • 主要为大家详细介绍了IOS使用UICollectionView实现无限轮播效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 今天移动端正好需要图片触摸滑动效果实现代码,基于swiper实现,需要的朋友可以参考下
  • LoopViewDemo APP无限轮播图的实现
  • 主要为大家详细介绍了android实现banner轮播图无限轮播效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 作者shabake,源码GHCarouselMapDemo,超简单无限轮播图组件` `轮播组件` `无限图片轮播` `无限文字轮播`
  • 本篇文章给大家介绍css实现三面立体旋转无限轮播图动画(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 首先小编在这里谢谢大家一直的支持,每天都会更新十个web前端基础内容,...

    本篇文章给大家介绍css实现三面立体旋转无限轮播图动画(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

    首先小编在这里谢谢大家一直的支持,每天都会更新十个web前端基础内容,需要的可以关注我,另外也可以进我的web学习交流群562708969,领取资料学习资料笔记,可以跟里面的小伙伴一起学习一起成长,不懂的问题也可以问我,随时给大家解答。再次感谢大家。

    在之前的文章里介绍横向播放的无限轮播图动画(如下图),本文我们将在之前的基础上进行修改,实现不一样的轮播图动画。

    1.gif

    三面立体旋转的轮播图

    通过一些小的改动,我们可以使用不同的多边形形状用于图像轮,以及更大的图像,从而产生不同的效果。在这种情况下,图像是两倍大并且放置在使用较少空间的三角形布置中。序列中仍然有八张相同的照片:

    2.gif

    使用Firefox,你会看到动画也在运行。除了额外的JavaScript代码,并用-moz替换 -webkit,我们必须添加-moz-transform-style:preserve-3d; 到css的#rotator a里, 因为它没有被继承(从Firefox v12开始)。

    这个例子略有变化,我们正在将照片从队列的前面移动到后面。在前一种情况下,我们将它们从队列的后面移动到前面。

    为此,我们将把:

    1

    target.insertBefore(arr[arr.length-1], arr[0]);

    变成:

    1

    target.appendChild(arr[0]);

    下面放上完整代码:

    html代码:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    <div id="stage3">

    <div id="rotator3" style="-webkit-animation-name: rotator3; -moz-animation-name: rotator3;">

    <a href="1.jpg"><img src="1.jpg" height="180"></a>

    <a href="2.jpg"><img src="2.jpg" height="180"></a>

    <a href="3.jpg"><img src="3.jpg" height="180"></a>

    <a href="4.jpg"><img src="4.jpg" height="180"></a>

    <a href="5.jpg"><img src="5.jpg" height="180"></a>

    <a href="6.jpg"><img src="6.jpg" height="180"></a>

    <a href="7.jpg"><img src="7.jpg" height="180"></a>

    <a href="8.jpg"><img src="8.jpg" height="180"></a>

    </div>

    </div>

    css代码:

    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

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    #stage3 {

       margin: 2em auto 1em 50%;

       height: 240px;

       -webkit-perspective: 1200px;

       -webkit-perspective-origin: 0 90px;

       -moz-perspective: 1200px;

       -moz-perspective-origin: 0 90px;

       -ms-perspective: 1200px;

       -ms-perspective-origin: 0 90px;

     }

     #rotator3 a {

       position: absolute;

       left: -151px;

       -moz-transform-style: preserve-3d;

     }

     #rotator3 a img {

       padding: 10px;

       border: 1px solid #ccc;

       background: #fff;

       -webkit-backface-visibility: hidden;

       -moz-backface-visibility: hidden;

       -ms-backface-visibility: hidden;

     }

     #rotator3 a:nth-of-type(1) img {

       -webkit-transform: rotateX(-90deg) translateZ(100px);

       -moz-transform: rotateX(-90deg) translateZ(100px);

       -ms-transform: rotateX(-90deg) translateZ(100px);

     }

     #rotator3 a:nth-of-type(2) img {

       -webkit-transform: translateZ(100px);

       -moz-transform: translateZ(100px);

       -ms-transform: translateZ(100px);

     }

     #rotator3 a:nth-of-type(3) img {

       -webkit-transform: rotateX(90deg) translateZ(100px);

       -moz-transform: rotateX(90deg) translateZ(100px);

       -ms-transform: rotateX(90deg) translateZ(100px);

     }

     #rotator3 a:nth-of-type(n+4) { display: none; }

     @-webkit-keyframes rotator3 {

       from { -webkit-transform: rotateX(0deg);  }

       to   { -webkit-transform: rotateX(90deg); }

     }

     @-moz-keyframes rotator3 {

       from { -moz-transform: rotateX(0deg);  }

       to   { -moz-transform: rotateX(90deg); }

     }

     @-ms-keyframes rotator3 {

       from { -ms-transform: rotateX(0deg);  }

       to   { -ms-transform: rotateX(90deg); }

     }

     #rotator3 {

       -webkit-transform-origin: 0 101px;

       -webkit-transform-style: preserve-3d;

       -webkit-animation-timing-function: cubic-bezier(1, 0.2, 0.2, 1);

       -webkit-animation-duration: 2s;

       -webkit-animation-delay: 1s;

       -moz-transform-origin: 0 101px;

       -moz-transform-style: preserve-3d;

       -moz-animation-timing-function: cubic-bezier(1, 0.2, 0.2, 1);

       -moz-animation-duration: 2s;

       -moz-animation-delay: 1s;

       -ms-transform-origin: 0 101px;

       -ms-transform-style: preserve-3d;

       -ms-animation-timing-function: cubic-bezier(1, 0.2, 0.2, 1);

       -ms-animation-duration: 2s;

       -ms-animation-delay: 1s;

     }

     #rotator3:hover {

       -webkit-animation-play-state: paused;

       -moz-animation-play-state: paused;

       -ms-animation-play-state: paused;

     }

    js代码:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    document.addEventListener("DOMContentLoaded", function() {

        var rotateComplete = function(e) {

          with(target.style) {

            webkitAnimationName = MozAnimationName = msAnimationName = "";

          }

          target.insertBefore(arr[arr.length - 1], arr[0]);

          setTimeout(function(el) {

            with(el.style) {

              webkitAnimationName = MozAnimationName = msAnimationName = "rotator3";

            }

          }, 0, target);

        };

        var target = document.getElementById("rotator3");

        var arr = target.getElementsByTagName("a");

        target.addEventListener("webkitAnimationEnd", rotateComplete, false);

        target.addEventListener("animationend", rotateComplete, false);

        target.addEventListener("MSAnimationEnd", rotateComplete, false);

      }, false);

    总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

    以上就是css实现三面立体旋转无限轮播图动画(代码示例)的详细内容,

    展开全文
  • 使用UICollectionView封装了一个无限循环的轮播图,实现手动轮播和定时器自动轮播,传入图片数组和标题数组,即可实现图片文字的轮播图,并有点击事件,实现代理方法可实现点击事件的处理 ///调用 class ...
    使用UICollectionView封装了一个无限循环的轮播图,实现手动轮播和定时器自动轮播,传入图片数组和标题数组,即可实现图片文字的轮播图,并有点击事件,实现代理方法可实现点击事件的处理

    ///调用

    class HomeViewController: BaseViewController {
    override func viewDidLoad() {
            super.viewDidLoad()
        let imageA = [
                "http://ygjkclass.com/pdres/ext_images/banner1.png",
                "http://ygjkclass.com/pdres/ext_images/banner3.png",
                "http://ygjkclass.com/pdres/ext_images/banner2.png",
                "http://ygjkclass.com/pdres/ext_images/tnb-2.png",
                "http://ygjkclass.com/pdres/ext_images/shimian-1.jpg"]
    
            let titleArray = ["第一张图片","第二张图片","第三张图片","第四张图片","第五张图片"]
    
    
            let scroller = CQScrollerPageView(frame: CGRect(x:0,y:0,width:ScreenW,height:150), images: imageA as NSArray,titles:titleArray)
            scroller.delegate = self
           view.addSubview:(scroller)
    
    }
    }
    extension HomeViewController:UITableViewDataSource,CQScrollerPageViewDelegate{
       func ScrollerPageDidSelectedAtIndex(Index: Int) {
    
        }    
    }

    ///源代码

    
    import UIKit
    
    protocol CQScrollerPageViewDelegate {
    
       /// 传出当前点击的Index
       ///
       /// - Parameter Index: Int
       func ScrollerPageDidSelectedAtIndex(Index:Int)
    }
    
    class CQScrollerPageView: UIView {
        var itemsArray:NSMutableArray? //图片数组
        var pageControl:UIPageControl!
        var timer:Timer? //自动滚动的定时器
        var titleArray:Array<Any>! //标题数组
        var delegate:CQScrollerPageViewDelegate? //点击的ddelegate
    
        init(frame:CGRect,images:NSArray,titles:Array<Any>){
            super.init(frame: frame)
            self.backgroundColor = .white
            self.frame = frame
    
            titleArray = titles
            itemsArray = NSMutableArray.init(array: images)
    
            //将图片第一张和最后一张添加到数组中的首末位置
            itemsArray?.add(images.firstObject as Any)
            itemsArray?.insert(images.lastObject as Any, at: 0)
    
            self.addSubview(CollectionView)
            CollectionView.contentOffset = CGPoint(x:CollectionView.bounds.size.width, y:0);
            DreawViews()
            pageControl.numberOfPages = images.count;
    
            timer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(Cycle), userInfo: nil, repeats: true)
            RunLoop.current.add(timer!, forMode: RunLoopMode.commonModes)
        }
    
       @objc func Cycle() {
        if CollectionView.isDragging {
            return
        }
    
        let targetX = CollectionView.contentOffset.x + CollectionView.bounds.size.width
        CollectionView.setContentOffset(CGPoint(x: targetX, y: 0), animated: true)
    
        }
    
        /// 懒加载Collection
        private lazy var CollectionView:UICollectionView = {
            let layout = UICollectionViewFlowLayout()
            layout.itemSize = CGSize(width: self.bounds.size.width, height: self.bounds.size.height)
            layout.minimumLineSpacing = 0;
            layout.scrollDirection = UICollectionViewScrollDirection.horizontal;
            let collec = UICollectionView(frame: self.bounds, collectionViewLayout: layout)
            collec.backgroundColor = .white
            collec.showsHorizontalScrollIndicator = false
            collec.isPagingEnabled = true
            collec.register(UINib.init(nibName: "ScrollerCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "PageScroller")
            collec.delegate = self
            collec.dataSource = self
            return collec
        }()
    
    
        func DreawViews() {
            pageControl = UIPageControl(frame: CGRect(x: self.centerX, y: 0, width: 0, height: 0))
            pageControl.pageIndicatorTintColor = .lightGray
            pageControl.currentPageIndicatorTintColor = .black
            pageControl.numberOfPages = (itemsArray?.count)!
            self.addSubview(pageControl!)
            pageControl.snp.makeConstraints { (make) in
                make.bottom.equalTo(0)
                make.height.equalTo(15)
                make.centerX.equalTo(self.centerX)
            }
        }
    
        func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
            cycleScroll()
            timer?.fireDate = NSDate(timeIntervalSinceNow: 3) as Date
        }
    
    
        func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
            cycleScroll()
        }
    
    
        //滚动的事件处理
        func cycleScroll(){
            let page = CollectionView.contentOffset.x/CollectionView.bounds.size.width;
            if (page == 0) {//滚动到左边
                CollectionView.contentOffset = CGPoint(x:CollectionView.bounds.size.width * CGFloat(((itemsArray?.count)! - 2)),y:0);
                pageControl.currentPage = (itemsArray?.count)! - 2;
            }else if (page == CGFloat((itemsArray?.count)! - 1)){//滚动到右边
                CollectionView.contentOffset = CGPoint(x:CollectionView.bounds.size.width,y:0);
                pageControl.currentPage = 0;
            }else{
                pageControl.currentPage = Int(page) - 1;
            }
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        deinit {
            guard let timer1 = self.timer
                else{ return }
            timer1.invalidate()
        }
    
    }
    
    extension CQScrollerPageView:UICollectionViewDelegate,UICollectionViewDataSource{
    
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return (itemsArray?.count)!
        }
    
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let collec:ScrollerCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "PageScroller", for: indexPath) as! ScrollerCollectionViewCell
            let url = URL(string:itemsArray![indexPath.row] as! String)
            collec.Image.kf.setImage(with: url)
    
            if indexPath.row >= 1 && indexPath.row <= ((itemsArray?.count)!-2){
                if (titleArray.count) > 0{
                 collec.Title.text = (titleArray?[indexPath.row - 1] as! String)
                }
            }
    
            return collec
        }
    
    
        func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            timer?.fireDate = NSDate(timeIntervalSinceNow: 3) as Date
            delegate?.ScrollerPageDidSelectedAtIndex(Index: indexPath.row - 1)
        }
    }
    
    
    展开全文
  • 在网上找了很多viewpager实现图片轮播的,但是大多数...假如有五张轮播图 item的编号为(0,1,2,3,4) 要想实现 无限循环 我们在这五张的头部和尾部各加一张即(5+2)张,item编号为(0,1,2,3,4,5,6)其中编号为0,6的两
  • 无限轮播图无BUG

    2015-07-24 09:23:35
    ViewPager无限轮播图无BUG,无限播放图片,fragment;
  • 无限轮播图 三种实现方式

    千次阅读 2016-07-05 18:19:32
    无限轮播图三种实现方式:(源码地址) 1、首尾相接方式: https://github.com/jakajacky/DRScrollerView 2、imageView复用方式: https://github.com/jakajacky/DRImgScrollView 3、UICollectionView实现...

    无限轮播图三种实现方式:(源码地址)
    1、首尾相接方式:
    https://github.com/jakajacky/DRScrollerView
    2、imageView复用方式:
    https://github.com/jakajacky/DRImgScrollView
    3、UICollectionView实现方式
    https://github.com/jakajacky/DRImgCollectionView

    该有的注释都在代码中了,三种方式大同小异,核心无非就是 欺骗视觉,在适当的时间,将位置重置

    第3种方式我花了点时间尽力做的完善一些,做成了开源三方,大家可以pod ‘DRImgCollectionView’, ‘~> 1.0.0’用用看一下,主要目的是想用swift写出来,所以先写了一遍OC的,之后会更新出swift版本。

    展开全文
  • 1.0版本: 基本实现了无限手动滚动,和无限自动滚动
  • Banner 轮播图框架公用类文件 API —> 开发者可以调用的所有接口 Cell —> 框架提供cell基类 (如果想自定义cell内容, 可以新建cell继承于JXBannerBaseCell) Common —> 框架公用类文件 Transform —> ...
    (JXBanner 支持多种动画变换, 支持纯代码布局和Xib布局)

    JXBanner依赖于JXPageControl,并包含许多自定义接口,如转换动画、视图结构和设置


      1. 开发环境: Xcode 7
      1. 运行条件: iOS(8.0+)
    • 开源框架:github地址

     

    (如果使用有什么问题,可以留言,欢迎一起学习,欢迎star)


    Installation [安装]

    安装,只需将以下面代码添加到您的Podfile:

    
    platform :ios, '8.0'
    
    target 'TargetName' do
    pod 'JXBanner'
    end
    
    

    UI效果

    • default

    不需要设置JXBanner -> JXBannerLayoutParams

    在这里插入图片描述


    • JXBannerTransformLinear

    在这里插入图片描述


    • JXBannerTransformCoverflow

    在这里插入图片描述


    • custom

    需要实现JXBannerTransformable协议, 修改 UICollectionViewLayoutAttributes -> transform3D 或 transform 属性

    在这里插入图片描述


    Frame set [框架集合]

     

    Banner 轮播图框架公用类文件
    • API —> 开发者可以调用的所有接口
    • Cell —> 框架提供cell基类 (如果想自定义cell内容, 可以新建cell继承于JXBannerBaseCell)
    • Common —> 框架公用类文件
    • Transform —> 动画效果类文件 ( 如果框架提供的动画效果不能满足开发者需求, 可以新建实现JXBannerTransformable协议的struct/class, 修改 UICollectionViewLayoutAttributes -> transform3D 或 transform 属性)
    PageControl 指示器类文件
    • JXBannerPageControlBuilder —> pageControl的构建者类
    • JXBannerPageControlDefault —> 框架默认的pageControl样式 (可以通过实现JXBannerDataSource -> 【jxBanner(pageControl banner: numberOfPages: coverView: builder:) -> JXBannerPageControlBuilder】协议方法修改样式)

    JXBanner 重要文件介绍

     

    JXBannerParams 【banner 属性】
    • isAutoPlay —> 自动播放
    • isBounces —> 边界能否越界滑动
    • timeInterval —> 播放调度间隔
    • isShowPageControl —> 是否加载内部指示器(JXPageControl(框架特色)
    • cycleWay —> 轮播方式(框架特色) (forward:无线向右播放, skipEnd:首尾自定义动画跳转, rollingBack:左右回滚模式)
    • edgeTransitionType —> cycleWay 使用 skipEnd 中 可以选取动画方式
    • edgeTransitionSubtype —> cycleWay 使用 skipEnd 中 可以选取动画方式

    JXBannerLayoutParams 【banner布局、动画属性】
    • itemSize —> cell大小。
    • itemSpacing —>cell左右边距。
    • layoutType —> 动画效果JXBannerTransformable(框架特色)
    • minimumScale —> cell 缩放系数。
    • minimumAlpha —> cell 透明度系数。
    • maximumAngle —> cell 旋转系数。
    • rateOfChange —> cell 变化系数。
    • rateHorisonMargin —> cell 水平间距调整系数。

    JXBannerCellRegister 【cell注册构建者】
    • type —> 注册cell的类型,必须是JXBannerBaseCell的子类

    • reuseIdentifier —> cell重用标识

      var type: JXBannerBaseCell.Type
      var reuseIdentifier: String


    JXBanner 使用

     

    Example 1
    • 默认实现示例

     

    
    import SnapKit
    import JXBanner
    
    class JXDefaultVC: UIViewController {
        
        var pageCount = 5
        
        lazy var banner: JXBanner = {
            let banner = JXBanner()
            banner.backgroundColor = UIColor.black
            banner.placeholderImgView.image = UIImage(named: "banner_placeholder")
            banner.delegate = self
            banner.dataSource = self
            return banner
        }()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            view.addSubview(banner)
            banner.snp.makeConstraints { (maker) in
                maker.left.right.equalTo(view)
                maker.height.equalTo(250)
                maker.top.equalTo(view.snp_top).offset(100)
            }
            self.automaticallyAdjustsScrollViewInsets = false
        }
        
        deinit {
            print("\(#function) ----------> \(#file.components(separatedBy: "/").last?.components(separatedBy: ".").first ?? #file)")
        }
    }
    
    //MARK:- JXBannerDataSource
    extension JXDefaultVC: JXBannerDataSource {
        
        // 注册重用Cell标识
        func jxBanner(_ banner: JXBannerType)
            -> (JXBannerCellRegister) {
                return JXBannerCellRegister(type: JXBannerCell.self,
                                            reuseIdentifier: "JXDefaultVCCell")
        }
        
        // 轮播总数
        func jxBanner(numberOfItems banner: JXBannerType)
            -> Int { return pageCount }
        
        // 轮播cell内容设置
        func jxBanner(_ banner: JXBannerType,
                      cellForItemAt index: Int,
                      cell: JXBannerBaseCell)
            -> JXBannerBaseCell {
                let tempCell: JXBannerCell = cell as! JXBannerCell
                tempCell.layer.cornerRadius = 8
                tempCell.layer.masksToBounds = true
                tempCell.imageView.image = UIImage(named: "banner_placeholder")
                tempCell.msgLabel.text = String(index) + "---来喽来喽,他真的来喽~"
                return tempCell
        }
        
        // banner基本设置(可选)
        func jxBanner(_ banner: JXBannerType,
                      layoutParams: JXBannerLayoutParams)
            -> JXBannerLayoutParams {
            return layoutParams
                .itemSize(CGSize(width: UIScreen.main.bounds.width - 40, height: 200))
                .itemSpacing(20)
        }
    }
    
    //MARK:- JXBannerDelegate
    extension JXDefaultVC: JXBannerDelegate {
        
        // 点击cell回调
        public func jxBanner(_ banner: JXBannerType,
                             didSelectItemAt index: Int) {
            print(index)
        }
        
    }
    
    
    

    Example 2

     

    • 个性化设置
    
    import SnapKit
    import JXBanner
    import JXPageControl
    
    class JXCustomVC: UIViewController {
        
        var pageCount = 5
        
        lazy var linearBanner: JXBanner = {[weak self] in
            let banner = JXBanner()
            banner.placeholderImgView.image = UIImage(named: "banner_placeholder")
            banner.backgroundColor = UIColor.black
            banner.indentify = "linearBanner"
            banner.delegate = self
            banner.dataSource = self
            return banner
        }()
        
        lazy var converflowBanner: JXBanner = {
            let banner = JXBanner()
            banner.placeholderImgView.image = UIImage(named: "banner_placeholder")
            banner.backgroundColor = UIColor.black
            banner.indentify = "converflowBanner"
            banner.delegate = self
            banner.dataSource = self
            return banner
        }()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            view.addSubview(linearBanner)
            view.addSubview(converflowBanner)
            linearBanner.snp.makeConstraints {(maker) in
                maker.left.right.equalTo(view)
                maker.height.equalTo(200)
                maker.top.equalTo(view.snp_top).offset(100)
            }
            
            converflowBanner.snp.makeConstraints {(maker) in
                maker.left.right.height.equalTo(linearBanner)
                maker.top.equalTo(linearBanner.snp_bottom).offset(100)
            }
            
            self.automaticallyAdjustsScrollViewInsets = false
        }
        
        deinit {
            print("\(#function) ----------> \(#file.components(separatedBy: "/").last?.components(separatedBy: ".").first ?? #file)")
        }
    }
    
    //MARK:- JXBannerDataSource
    extension JXCustomVC: JXBannerDataSource {
        
        // 注册重用Cell标识
        func jxBanner(_ banner: JXBannerType)
            -> (JXBannerCellRegister) {
    
                if banner.indentify == "linearBanner" {
                    return JXBannerCellRegister(type: JXBannerCell.self,
                                                reuseIdentifier: "LinearBannerCell")
                }else {
                    return JXBannerCellRegister(type: JXBannerCell.self,
                                                reuseIdentifier: "ConverflowBannerCell")
                }
        }
        
        // 轮播总数
        func jxBanner(numberOfItems banner: JXBannerType)
            -> Int { return pageCount }
        
        // 轮播cell内容设置
        func jxBanner(_ banner: JXBannerType,
                      cellForItemAt index: Int,
                      cell: JXBannerBaseCell)
            -> JXBannerBaseCell {
                let tempCell: JXBannerCell = cell as! JXBannerCell
                tempCell.layer.cornerRadius = 8
                tempCell.layer.masksToBounds = true
                tempCell.imageView.image = UIImage(named: "banner_placeholder")
                tempCell.msgLabel.text = String(index) + "---来喽来喽,他真的来喽~"
                return tempCell
        }
        
        // banner基本设置(可选)
        func jxBanner(_ banner: JXBannerType,
                      params: JXBannerParams)
            -> JXBannerParams {
            
                if banner.indentify == "linearBanner" {
                    return params
                        .timeInterval(2)
                        .cycleWay(.forward)
                }else {
                    return params
                        .timeInterval(3)
                        .cycleWay(.forward)
                }
        }
        
        // banner布局、动画设置
        func jxBanner(_ banner: JXBannerType,
                      layoutParams: JXBannerLayoutParams)
            -> JXBannerLayoutParams {
                
                if banner.indentify == "linearBanner" {
                    return layoutParams
                        .layoutType(JXBannerTransformLinear())
                        .itemSize(CGSize(width: 250, height: 190))
                        .itemSpacing(10)
                        .rateOfChange(0.8)
                        .minimumScale(0.7)
                        .rateHorisonMargin(0.5)
                        .minimumAlpha(0.8)
                }else {
                    return layoutParams
                        .layoutType(JXBannerTransformCoverflow())
                        .itemSize(CGSize(width: 300, height: 190))
                        .itemSpacing(0)
                        .maximumAngle(0.25)
                        .rateHorisonMargin(0.3)
                        .minimumAlpha(0.8)
                }
        }
        
        // 自定义pageControl样式、布局
        //(基于jxPageControl, 如果不适用JXPageControl, 设置isShowPageControl = false, 内部pageControl将不会再次加载 ) 
        func jxBanner(pageControl banner: JXBannerType,
                      numberOfPages: Int,
                      coverView: UIView,
                      builder: JXBannerPageControlBuilder) -> JXBannerPageControlBuilder {
    
            if banner.indentify == "linearBanner" {
                let pageControl = JXPageControlScale()
                pageControl.contentMode = .bottom
                pageControl.activeSize = CGSize(width: 15, height: 6)
                pageControl.inactiveSize = CGSize(width: 6, height: 6)
                pageControl.activeColor = UIColor.red
                pageControl.inactiveColor = UIColor.lightGray
                pageControl.columnSpacing = 0
                pageControl.isAnimation = true
                builder.pageControl = pageControl
                builder.layout = {
                    pageControl.snp.makeConstraints { (maker) in
                        maker.left.right.equalTo(coverView)
                        maker.top.equalTo(coverView.snp_bottom).offset(10)
                        maker.height.equalTo(20)
                    }
                }
                return builder
    
            }else {
                let pageControl = JXPageControlExchange()
                pageControl.contentMode = .bottom
                pageControl.activeSize = CGSize(width: 15, height: 6)
                pageControl.inactiveSize = CGSize(width: 6, height: 6)
                pageControl.activeColor = UIColor.red
                pageControl.inactiveColor = UIColor.lightGray
                pageControl.columnSpacing = 0
                builder.pageControl = pageControl
                builder.layout = {
                    pageControl.snp.makeConstraints { (maker) in
                        maker.left.right.equalTo(coverView)
                        maker.top.equalTo(coverView.snp_bottom).offset(10)
                        maker.height.equalTo(20)
                    }
                }
                return builder
            }
    
        }
        
    }
    
    //MARK:- JXBannerDelegate
    extension JXCustomVC: JXBannerDelegate {
        
        // 点击cell回调
        public func jxBanner(_ banner: JXBannerType,
                             didSelectItemAt index: Int) {
            print(index)
        }
        
        // 设置自定义覆盖View, 比如添加自定义外部pageControl和布局
        func jxBanner(_ banner: JXBannerType, coverView: UIView) {
            let title = UILabel()
            title.frame = CGRect(x: 0, y: 0, width: 100, height: 30)
            title.text = "JXBanner"
            title.textColor = UIColor.red
            title.font = UIFont.systemFont(ofSize: 16)
            coverView.addSubview(title)
        }
        
        // 最中心显示cell 索引
        func jxBanner(_ banner: JXBannerType, center index: Int) {
            print(index)
        }
    }
    
    
    Example 3

    如果框架提供的动画效果不能满足开发者需求:

      1. 轮播图动画样式开发者可以自定义实现, 只要是新建实现JXBannerTransformable协议的struct/class, 修改 UICollectionViewLayoutAttributes -> transform3D 或 transform 属性)
    
    //
    //  JXCustomTransform.swift
    //  JXBanner_Example
    //
    //  Created by 谭家祥 on 2019/7/30.
    //  Copyright © 2019 CocoaPods. All rights reserved.
    //
    
    import UIKit
    import JXBanner
    
    struct JXCustomTransform: JXBannerTransformable {
        
        public func transformToAttributes(collectionView: UICollectionView,
                                          params: JXBannerLayoutParams,
                                          attributes: UICollectionViewLayoutAttributes) {
            
            let collectionViewWidth = collectionView.frame.width
            if collectionViewWidth <= 0 { return }
            
            let centetX = collectionView.contentOffset.x + collectionViewWidth * 0.5;
            let delta = abs(attributes.center.x - centetX)
            let calculateRate = 1 - delta / collectionViewWidth
            let angle = min(delta / collectionViewWidth * (1 - params.rateOfChange), params.maximumAngle)
            let alpha = max(calculateRate, params.minimumAlpha)
            
            
            applyCoverflowTransformToAttributes(viewCentetX: centetX,
                                                attributes: attributes,
                                                params: params,
                                                angle: angle,
                                                alpha: alpha,
                                                calculateRate: calculateRate)
        }
        
        func applyCoverflowTransformToAttributes(viewCentetX: CGFloat,
                                                 attributes: UICollectionViewLayoutAttributes,
                                                 params: JXBannerLayoutParams,
                                                 angle: CGFloat,
                                                 alpha: CGFloat,
                                                 calculateRate: CGFloat) -> Void {
            var transform3D: CATransform3D = CATransform3DIdentity
            
            
            let location = JXBannerTransfrom.itemLocation(viewCentetX: viewCentetX,
                                                          itemCenterX: attributes.center.x)
    
            var _angle = angle
            var _alpha = alpha
            var _translateX: CGFloat = 0
            var _translateY: CGFloat = 0
            attributes.zIndex = 0
            
            switch location {
            case .left:
                _angle = angle
                _translateX = 0.2 * attributes.size.width * (1 - calculateRate) / 4
                _translateY = 0.4 * attributes.size.height * (1 - calculateRate)
                
                
            case .right:
                _angle = -angle
                _translateX = -0.2 * attributes.size.width * (1 - calculateRate) / 4
                _translateY = 0.4 * attributes.size.height * (1 - calculateRate)
                
            case .center:
                _angle = 0
                _alpha = 1
                _translateY = 0
                attributes.zIndex = 10000
            }
            
            transform3D = CATransform3DTranslate(transform3D, _translateX, _translateY, 0)
            transform3D = CATransform3DRotate(transform3D, -CGFloat.pi * _angle, 0, 0, 1)
            attributes.alpha = _alpha
            attributes.transform3D = transform3D
        }
    
    }
    
    
    
      1. 设置自定义实现动画

    JXBannerDataSource -> 【jxBanner(_ banner: layoutParams: ) -> JXBannerLayoutParams】

    
        // JXCustomTransform()
    
        func jxBanner(_ banner: JXBannerType,
                      layoutParams: JXBannerLayoutParams)
            -> JXBannerLayoutParams {
                
                return layoutParams
                    .layoutType(JXCustomTransform())
        }
    
    

    更多设置可以参考示例 Demo地址

    展开全文
  • 通过UIScrollView实现的一个无限轮播图,原理是:我自始至终只创建3个imageView到scrollView上,然后滑动的时候不断的改变contentOffSet.如果有什么bug和不足之处,希望指正!非常期待你的建议!
  • Swift实现广告轮播图。无限轮播图。Android中的ViewPager
  • android轮播图简单实现 支持左右无限无缝轮播 自动轮播 ,android轮播图简单实现 支持左右无限无缝轮播 自动轮播

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,894
精华内容 11,557
关键字:

无限轮播图