iOS开发商品页中banner中点击查看图片

轮翻播放与查看是分开的,轮翻是是用 开源的SDCycleScrollView

这里是给出的是查看的:

//
// FullScreenShowImageView.swift
// joopic
//
// Created by jianxiong li on 16/9/27.
// Copyright © 2016年 joobot. All rights reserved.
//
import Foundation
import UIKit
//图片轮播组件代理协议
protocol FullScreenShowImageViewDelegate{
 //获取数据源
 func galleryDataSource()->[String]
 //获取内部scrollerView的宽高尺寸
 func galleryScrollerViewSize()->CGSize

 func hiddenForCliked(index:Int)
}
//图片轮播组件控制器
class FullScreenShowImageView: UIView,UIScrollViewDelegate{
 //代理对象
 var delegate : FullScreenShowImageViewDelegate!

 //屏幕宽度
 let kScreenWidth = BWidth

 //当前展示的图片索引
 var currentIndex : Int = 0

 //数据源
 var dataSource : [String]?

 //用于轮播的左中右三个image(不管几张图片都是这三个imageView交替使用)
 var leftImageView , middleImageView , rightImageView : UIImageView?

 //放置imageView的滚动视图
 var scrollerView : UIScrollView?

 //scrollView的宽和高
 var scrollerViewWidth : CGFloat?
 var scrollerViewHeight : CGFloat?

 //页控制器(小圆点)
 var pageControl : UIPageControl?

 //加载指示符(用来当iamgeView还没将图片显示出来时,显示的图片)
 var placeholderImage:UIImage!

 //自动滚动计时器
 var autoScrollTimer:NSTimer?
 init(frame: CGRect,delegate:FullScreenShowImageViewDelegate) {
  super.init(frame: frame)
  self.delegate = delegate
  praperaUI()
 }
 required init?(coder aDecoder: NSCoder) {
  fatalError("init(coder:) has not been implemented")
 }

 func praperaUI() {

  //获取并设置scrollerView尺寸
  let size : CGSize = self.delegate.galleryScrollerViewSize()
  self.scrollerViewWidth = size.width
  self.scrollerViewHeight = size.height

  //获取数据
  self.dataSource = self.delegate.galleryDataSource()
  //设置scrollerView
  self.configureScrollerView()

  //设置加载指示图片
  self.configurePlaceholder()

  //设置imageView
  self.configureImageView()

  //设置页控制器
  self.configurePageController()

  //设置自动滚动计时器
  //self.configureAutoScrollTimer()

  self.backgroundColor = UIColor.blackColor()

  self.addTapAction()
 }

 func addTapAction(){
  //添加组件的点击事件
  let tap = UITapGestureRecognizer(target: self,
           action: #selector(FullScreenShowImageView.handleTapAction(_:)))
  self.addGestureRecognizer(tap)
 }

 //点击事件响应
 func handleTapAction(tap:UITapGestureRecognizer)->Void{
  //获取图片索引值
  self.delegate.hiddenForCliked(self.currentIndex)
  self.dismissViewAnimate()
 }

 func presentViewAnimate() {

  let fr = self.middleImageView?.frame
  self.middleImageView?.frame = CGRect(x: fr!.origin.x, y: 22, width: fr!.width, height: fr!.height)
  UIView.animateWithDuration(10, animations: {

   self.middleImageView?.frame = fr!

  }) { (_) in

  }

 }

 func dismissViewAnimate() {

  let fr = self.middleImageView?.frame
  self.middleImageView?.frame = CGRect(x: fr!.origin.x, y: fr!.origin.y - StatusAndNavHeight, width: fr!.width, height: fr!.height)
  UIView.animateWithDuration(10, animations: {

    self.middleImageView?.frame = CGRect(x: fr!.origin.x , y: -42, width: fr!.width, height: fr!.height)

  }) { (_) in

   self.hidden = true
   self.middleImageView?.frame = fr!
  }

 }

 //设置scrollerView
 func configureScrollerView(){
  self.scrollerView = UIScrollView(frame: CGRect(x: 0,y: 0,
   width: self.scrollerViewWidth!, height: BHeight))

  self.scrollerView?.backgroundColor = UIColor.blackColor()
  self.scrollerView?.delegate = self
  self.scrollerView?.contentSize = CGSize(width: self.scrollerViewWidth! * 3,
            height: BHeight)
  //滚动视图内容区域向左偏移一个view的宽度
  self.scrollerView?.contentOffset = CGPoint(x: self.scrollerViewWidth!, y: 0)
  self.scrollerView?.pagingEnabled = true
  self.scrollerView?.bounces = false
  self.addSubview(self.scrollerView!)

 }

 //设置加载指示图片
 func configurePlaceholder(){
  //这里我使用ImageHelper将文字转换成图片,作为加载指示符
  let font = UIFont.systemFontOfSize(17)// UIFont.systemFont(ofSize: 17.0, weight: UIFontWeightMedium)
  let size = CGSize(width: self.scrollerViewWidth!, height: self.scrollerViewHeight!)
  placeholderImage = UIImage(named: "图片加载中...")
 }

 //设置imageView
 func configureImageView(){

  self.leftImageView = UIImageView(frame: CGRect(x: 0, y: (BHeight-scrollerViewHeight!)/2,
   width: self.scrollerViewWidth!, height: self.scrollerViewHeight!))

  self.middleImageView = UIImageView(frame: CGRect(x: self.scrollerViewWidth!, y: (BHeight-scrollerViewHeight!)/2,
   width: self.scrollerViewWidth!, height: self.scrollerViewHeight! ));

  self.rightImageView = UIImageView(frame: CGRect(x: 2*self.scrollerViewWidth!, y: (BHeight-scrollerViewHeight!)/2,
   width: self.scrollerViewWidth!, height: self.scrollerViewHeight!));
  self.scrollerView?.showsHorizontalScrollIndicator = false

  self.leftImageView?.contentMode = UIViewContentMode.ScaleAspectFit
  self.middleImageView?.contentMode = UIViewContentMode.ScaleAspectFit
  self.rightImageView?.contentMode = UIViewContentMode.ScaleAspectFit

  //设置初始时左中右三个imageView的图片(分别时数据源中最后一张,第一张,第二张图片)
  if(self.dataSource?.count != 0){
   resetImageViewSource()
  }

  self.scrollerView?.addSubview(self.leftImageView!)
  self.scrollerView?.addSubview(self.middleImageView!)
  self.scrollerView?.addSubview(self.rightImageView!)
 }

 //设置页控制器
 func configurePageController() {
  self.pageControl = UIPageControl(frame: CGRect(x: kScreenWidth/2-60,
               y: BHeight - 30, width: 120, height: 20))
  self.pageControl?.numberOfPages = (self.dataSource?.count)!
  self.pageControl?.userInteractionEnabled = false
  self.addSubview(self.pageControl!)
 }

 //设置自动滚动计时器
 func configureAutoScrollTimer() {
  //设置一个定时器,每三秒钟滚动一次
  autoScrollTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: #selector(SliderGalleryController.letItScroll), userInfo: nil, repeats: true)
 }

 //计时器时间一到,滚动一张图片
 func letItScroll(){
  let offset = CGPoint(x: 2*scrollerViewWidth!, y: 0)
  self.scrollerView?.setContentOffset(offset, animated: true)
 }

 //每当滚动后重新设置各个imageView的图片
 func resetImageViewSource() {
  //当前显示的是第一张图片
  if self.currentIndex == 0 {
   self.leftImageView?.sd_setImageWithURL(NSURL(string: self.dataSource!.last!))
   self.middleImageView?.sd_setImageWithURL(NSURL(string: self.dataSource!.first!))
   let rightImageIndex = (self.dataSource?.count)!>1 ? 1 : 0 //保护
   self.rightImageView?.sd_setImageWithURL(NSURL(string: self.dataSource![rightImageIndex]))

  }
   //当前显示的是最后一张图片
  else if self.currentIndex == (self.dataSource?.count)! - 1 {

   self.leftImageView?.sd_setImageWithURL(NSURL(string:self.dataSource![self.currentIndex-1]))
   self.middleImageView?.sd_setImageWithURL(NSURL(string: self.dataSource!.last!))
   self.rightImageView?.sd_setImageWithURL(NSURL(string: self.dataSource!.first!))

  }
   //其他情况
  else{

   self.leftImageView?.sd_setImageWithURL(NSURL(string:self.dataSource![self.currentIndex-1]))
   self.middleImageView?.sd_setImageWithURL(NSURL(string: self.dataSource![self.currentIndex]))
   self.rightImageView?.sd_setImageWithURL(NSURL(string: self.dataSource![self.currentIndex+1]))
  }

  //设置页控制器当前页码
  self.pageControl?.currentPage = self.currentIndex
 }

 //scrollView滚动完毕后触发
 func scrollViewDidScroll(scrollView: UIScrollView) {
  //获取当前偏移量
  let offset = scrollView.contentOffset.x

  if(self.dataSource?.count != 0){

   //如果向左滑动(显示下一张)
   if(offset >= self.scrollerViewWidth!*2){
    //还原偏移量
    scrollView.contentOffset = CGPoint(x: self.scrollerViewWidth!, y: 0)
    //视图索引+1
    self.currentIndex = self.currentIndex + 1

    if self.currentIndex == self.dataSource?.count {
     self.currentIndex = 0
    }
   }

   //如果向右滑动(显示上一张)
   if(offset <= 0){
    //还原偏移量
    scrollView.contentOffset = CGPoint(x: self.scrollerViewWidth!, y: 0)
    //视图索引-1
    self.currentIndex = self.currentIndex - 1

    if self.currentIndex == -1 {
     self.currentIndex = (self.dataSource?.count)! - 1
    }
   }

   //重新设置各个imageView的图片
   resetImageViewSource()

  }
 }

 //手动拖拽滚动开始
 func scrollViewWillBeginDragging(scrollView: UIScrollView) {
  //使自动滚动计时器失效(防止用户手动移动图片的时候这边也在自动滚动)
  //autoScrollTimer?.invalidate()
 }

 //手动拖拽滚动结束
 func scrollViewDidEndDragging(scrollView: UIScrollView,
         willDecelerate decelerate: Bool) {
  //重新启动自动滚动计时器
  //configureAutoScrollTimer()

 }
}

如何使用:

var sliderGallery : FullScreenShowImageView!
 var bannerCurrentIndex:Int = 0

 //图片轮播组件协议方法:获取内部scrollView尺寸
 func galleryScrollerViewSize() -> CGSize {
  return CGSize(width: BWidth, height: BHeight/2)
 }

 //图片轮播组件协议方法:获取数据集合
 func galleryDataSource() -> [String] {
  return self.bannerView.imageURLStringsGroup as! [String]
 }

  //点击事件响应
 func hiddenForCliked(index:Int){
  if(bannerCurrentIndex != index){
    self.bannerView.scrollToIndex(Int32(index))
  }
  self.navigationController?.setNavigationBarHidden(false, animated: false)
 }

 func showImageGallery(index:Int){
  //初始化图片轮播组件
  if(sliderGallery == nil){
   sliderGallery = FullScreenShowImageView(frame: CGRect(x: 0, y: 0, width: BWidth,
    height: BHeight),delegate:self)

   sliderGallery.currentIndex = index
   sliderGallery.resetImageViewSource()

   //将图片轮播组件添加到当前视图
   self.view.addSubview(sliderGallery)

  }else{
   sliderGallery.currentIndex = index
   sliderGallery.resetImageViewSource()
   sliderGallery.hidden = false

  }
  self.sliderGallery.presentViewAnimate()
  self.navigationController?.setNavigationBarHidden(true, animated: false)
 }

 //pragma -- SDCycleScrollViewDelegate
 func cycleScrollView(cycleScrollView: SDCycleScrollView!, didSelectItemAtIndex index: Int) {
  print("--------index:\(index)")
  bannerCurrentIndex = index
  self.showImageGallery(index)

 }

以上就是本次我们整理的代码全部内容,如果大家学习时候还有任何不明白的地方,可以在下方的留言区讨论,感谢你对我们的支持。

(0)

相关推荐

  • iOS开发商品页中banner中点击查看图片

    轮翻播放与查看是分开的,轮翻是是用 开源的SDCycleScrollView 这里是给出的是查看的: // // FullScreenShowImageView.swift // joopic // // Created by jianxiong li on 16/9/27. // Copyright © 2016年 joobot. All rights reserved. // import Foundation import UIKit //图片轮播组件代理协议 protocol FullS

  • IOS开发OC代码中创建Swift编写的视图控制器

    IOS开发OC代码中创建Swift编写的视图控制器 背景 近日在和一群朋友做项目,我和另一位同学负责iOS客户端,我是一直使用OC的,而他只会Swift,因此在我们分工协作之后,就需要把代码合在一起,这就牵扯到如何在TabbarController中添加一个swift创建的子控制器的问题. 解决 首先在一个OC项目中新建一个Swift类,继承自UITableViewController,并且修改其view背景色,方便后续测试. import UIKit class ESSwiftTableVie

  • iOS如何固定UITableView中cell.imageView.image的图片大小

    前言 凡是进行iOS开发的,基本上都会遇到要展示列表,或者即使不是标准列表,但由于数量不固定,也需要如同列表一样从上往下显示.加载的情况.这些,都绕不过对UITableView的使用. 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是UITableView.当然它的广泛使用自然离不开它强大的功能. 我们经常在开发过程中会用到默认UITableView的cell.imageView.image,

  • VSCode Webview中实现点击下载图片的基本流程

    众所周知,在一个普通的HTML页面中,如果要实现一个链接点击后下载图片,只需要在页面上放一个<a>标签,然后将属性href的值指向图片的URL或者Base64字符串就可以了.或者按照stackoverflow上提供的方法动态创建<a>标签来完成图片的下载动作.不过原理都是相同的. 但是这个方法在VSCode的Webview中不起作用,点击链接之后没有任何反应.如果图片的地址是一个可以独立访问的绝对地址,例如任何一个互联网上可以访问到的图片地址,则点击链接之后VSCode会将图片在浏

  • iOS开发中TabBar再次点击实现刷新效果

    需求 之前已经实现了自定义TabBar,如图所示: 自定义TabBar.jpeg 现在需要实现一个类似今日头条TabBar的功能 -- 如果继续点击当前TabBar的选中项,那么该界面需要刷新UITableView. 分析 既然已经自定义了TabBar,那么最简单的就是在自定义中给TabBar中需要的UITabBarButton添加事件 -- 点击就发送通知,并且将当前的索引传出去.对应的界面监听通知,拿到索引比对,如果和当前索引一致,就执行对应的操作. 实现 1. 自定义TabBar的layo

  • iOS开发中使用UIScrollView实现无限循环的图片浏览器

    一.概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件都介绍一遍确实没有必要,所谓授人以鱼不如授人以渔,这里会尽可能让大家明白其中的原理,找一些典型的控件进行说明,这样一来大家就可以触类旁通.今天我们主要来看一下UIScrollView的内容: UIView UIScrollView 实战--图片浏览器 二.UIView 在熟悉UIScrollView之前很有必要说一下UIView的内容.

  • iOS开发中常用的各种动画、页面切面效果

    今天主要用到的动画类是CALayer下的CATransition至于各种动画类中如何继承的在这也不做赘述,网上的资料是一抓一大把.好废话少说切入今天的正题. 一.封装动画方法 1.用CATransition实现动画的封装方法如下,每句代码是何意思,请看注释之. #pragma CATransition动画实现 - (void) transitionWithType:(NSString *) type WithSubtype:(NSString *) subtype ForView : (UIVi

  • 详解IOS开发中生成推送的pem文件

    详解IOS开发中生成推送的pem文件 具体步骤如下: 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录到 iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/index.action )并点击 App IDs 2. 创建一个不使用通配符的 App ID .通配符 ID 不能用于推送通知服务.例如,  com.itotem.ip

  • IOS开发中禁止NavigationController的向右滑动返回

    IOS开发中禁止NavigationController的向右滑动返回 大家在进行开法的时候细心的朋友会发现,.用后在屏幕的最左边,向右滑动,,你会发现,你的App返回到了上一个页面,这是怎么回事呢, 在你的App中输入UINavigationController ,然后按住commend键,点击鼠标,跳进去,如下图: 在UINavigationController 的属性中你会发现 红色下划线部分,你看到了UINavigationController 自带的有一个panGeesture,所以,

  • iOS开发中Quartz2D控制圆形缩放和实现刷帧效果

    Quartz2D简要回顾 一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 二.Quartz2D在iOS开发中的价值 为了便于搭建美观的UI界面,iOS提供了UIKit框架,⾥⾯有各种各样的UI控件 UILabel:显⽰文字 UIImageView:显示图片 UIButton:同时显示图片和⽂

随机推荐