转载

初识 swift 封装轮播图

一、简介

换了一家公司、换了一个环境刚开始来公司自然不能有一丝一毫的放松,每天即使是没有什么工作也是看看这个博客、那个源码。尽量让自己更充实。慢慢的开始写几篇博客记录下自己遇到的一些问题和解决方法。其实也没什么就是瞎写没有什么思路反正就是遇到问题然后解决掉、最后分享出去。

随着工作走向正规公司的项目不是那么赶、也就有时间尝试一些新的东西。只是不想刚开始编程哪会那么激进今天学这个明天学那个了。APPLE 发布 swift 有一年多了、不能说好也不能说不好、总之没有了解过时没有话语权的。所以就想试试。一开始我也想过仅使用swift 、后来发现这样做在我目前的项目中是不实际的因为有些东西已经用oc封装的很好了、总不能再花大把大把的时间重新来一次吧!最后决定使用oc+swift 混合编程。

在做 app 开发过程中发现轮播图出现的概率是相当大的。 就先从这个入手吧!

代码没有多的注释、但是简单易读。

二、用到的知识点

构造函数、变量、属性封装、方法重载、

构造函数:如果没有什么特殊的要求我们只要重写父类的构造函数就ok了、如果有特殊的业务需要自定义。     

1) func init(firstName:String,lastName:String)  2) init(firstName:String,lastName:String) 以上两种方式 1)会报错 2)正确

变量、属性封装:这个一开始特别不适应、主要是 ? ! 这两个符号

如是代码:  1)变量 private var _firstName:String=String(); //定义变量并初始化 private var _lastName:String?   //定义变量默认初始化 private var _sex:Bool=true; private var _age:Int?;   2) 属性 var firstName:String{ get{return _firstName} set{_firstName=newValue}  // 默认setter 的传人参数名称是 newVlaue } var lastName:String{ get {return _lastName} set(newLastName){_lastName=newLastName} // 可以定义setter 传入参数的名称 例如:newLastName }

对于默认初始化 ‘?’ 的使用大家可以到网上搜索一下、这里讲一下如何使用定义成 ? 的变量或属性的使用。个人总结为:取值使用! 当访问其属性时用?

例如: private _address:String?; var Address:String?{ get {return _address!} // 这里使用 ! set {_address = newValue} }  func test(){ self.Address?debugDescription // 访问该变量的相应属性使用? var emtpy:String? = self.Address!// 取值调用!  self.Address = empty! //取值调用 ! }

? !的使用是相对的。

方法重载:直接看代码

func loadData(image:Array<String>){         self.loadData(image, title: nil);     }     func loadData(image:Array<String> ,title:Array<String>?){     }

二、功能实现

功能实现直接上代码 请导入 SDWebImage 第三方库

初识 swift 封装轮播图
protocol KYScrollPageDelegate{  func imageSelectTap(index:Int) } class KYScrollPage: UIView,UIScrollViewDelegate {  private var noteTitle:UILabel?  private var arrayTitle:Array<String>?  private var arrayImage:Array<String>?  private var mainScroll:UIScrollView?  private var pageControl:UIPageControl?  private var currentPage:Int=0;  private var pageSize:Int=0;  private var titleHeight:CGFloat=20.0;  //MARK: ======================================================== 变量  private var _startTimer:Bool = false;  private var _timeInterval:Double=2.0;  private var _hiddenTitle:Bool=false;  private var _colorTitle:UIColor=UIColor.whiteColor();  private var _hiddenPageControl:Bool=false;  private var _contentHorizontalAlignment:UIControlContentHorizontalAlignment=UIControlContentHorizontalAlignment.Center  var deleagte:KYScrollPageDelegate?  override init(frame: CGRect) {   super.init(frame: frame);   self.mainScroll = UIScrollView();   self.pageControl = UIPageControl();   self.hiddenTitle = false;   self.hiddenPageControl = false;   self.contentHorizontalAlignment=UIControlContentHorizontalAlignment.Center;  }  required init(coder aDecoder: NSCoder) {   super.init(coder: aDecoder)  }  //MARK: ======================================================== KYScrollPage 协议实现    func loadData(image:Array<String>){   self.loadData(image, title: nil);  }  func loadData(image:Array<String> ,title:Array<String>?){   self.arrayImage = image;   self.arrayTitle = title!;   var tempArray:Array<String>=image;   tempArray.insert(image.last!, atIndex: 0);   tempArray.append(image.first!);   self.arrayImage = tempArray;   self.pageSize = self.arrayImage!.count;   self.mainScroll!.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);   var width:CGFloat = self.frame.size.width * CGFloat(self.pageSize);   self.mainScroll?.contentSize=CGSizeMake(width, self.frame.size.height);   self.mainScroll?.showsHorizontalScrollIndicator = false;   self.mainScroll?.showsVerticalScrollIndicator = false;   self.mainScroll?.scrollsToTop = false;   self.mainScroll?.pagingEnabled = true;   self.mainScroll?.delegate = self;   for (var i:Int=0; i<self.pageSize; i++) {    let imageUrl:String = self.arrayImage![i];    var imgeView:UIImageView = UIImageView();    if imageUrl.hasPrefix("http://")  {     imgeView.sd_setImageWithURL(NSURL(string: imageUrl), placeholderImage: UIImage(named:"Icon-60"));    } else    {     imgeView.image=UIImage(named:"Icon-60");    }    imgeView.frame = CGRectMake(self.frame.size.width*CGFloat(i), CGFloat(0), self.frame.size.width, self.frame.size.height);    imgeView.tag = i;    var Tap:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: Selector("imageGestureTap:"));    Tap.numberOfTapsRequired=1;    Tap.numberOfTouchesRequired=1;    imgeView.userInteractionEnabled=true;    imgeView.addGestureRecognizer(Tap);    self.mainScroll?.addSubview(imgeView);   }   self.mainScroll?.setContentOffset(CGPointMake(self.frame.size.width, 0), animated: false);   self.addSubview(self.mainScroll!);   self.contentHorizontalAlignment = _contentHorizontalAlignment;   self.pageControl!.currentPage=0;   self.pageControl!.pageIndicatorTintColor = UIColor(red: 155/255.0, green:  155/255.0, blue:  155/255.0, alpha: 1.0);   self.pageControl!.currentPageIndicatorTintColor=UIColor.whiteColor();   self.pageControl!.userInteractionEnabled = false;   self.pageControl!.numberOfPages=self.pageSize-2;   self.pageControl?.hidden=self.hiddenPageControl;   self.addSubview(self.pageControl!);   if arrayTitle != nil{    self.noteTitle = UILabel(frame:CGRectMake(10,self.frame.size.height-self.titleHeight, self.frame.size.width, self.titleHeight));    self.noteTitle!.text=self.arrayTitle!.first;    noteTitle?.textColor = _colorTitle;    noteTitle?.backgroundColor=UIColor.clearColor();    noteTitle?.font=UIFont.systemFontOfSize(13.0);    noteTitle?.hidden=self.hiddenTitle;    self.addSubview(noteTitle!);   }  }  //MARK: - ========================================================= UIScrollView 协议实现  func scrollViewDidScroll(scrollView: UIScrollView) {   var pageWidth:CGFloat = scrollView.frame.size.width;   var x:CGFloat = scrollView.contentOffset.x;   var page:Int = Int(((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1);   self.currentPage=page;   pageControl!.currentPage=page-1;   var titleIndex:Int=page-1;   if (titleIndex==self.arrayTitle!.count) {    titleIndex=0;   }   if (titleIndex<0) {    titleIndex=self.arrayTitle!.count-1;   }   if (titleIndex>self.arrayTitle!.count-1) {    noteTitle?.text="";   }   else   {    noteTitle?.text=self.arrayTitle![titleIndex];   }  }  func scrollViewDidEndDecelerating(scrollView: UIScrollView) {   if (currentPage==0) {    scrollView.setContentOffset(CGPointMake(CGFloat(arrayImage!.count-2)*self.frame.size.width, CGFloat(0)), animated: false)   }   if (currentPage==(self.arrayImage!.count-1)) {    scrollView.setContentOffset(CGPointMake(self.frame.size.width, CGFloat(0)), animated: false)   }  }  @objc private func imageGestureTap(getsture:UITapGestureRecognizer){   if (self.deleagte != nil) {    self.deleagte?.imageSelectTap(getsture.view!.tag);   }  }  // pagecontrol 选择器的方法  func turnPage()  {   var page:Int = self.pageControl!.currentPage;   self.mainScroll?.scrollRectToVisible(CGRectMake(CGFloat(self.frame.size.width*CGFloat(page+1)),0,self.frame.size.width,self.frame.size.height), animated: false);  }  // 定时器 绑定的方法  func runTimePage()  {   var page:Int = self.pageControl!.currentPage; // 获取当前的page   page++;   page = page >= self.arrayImage!.count-2 ? 0 : page ;   self.pageControl!.currentPage = page;   self.turnPage();  }  //MARK: ======================================================== 属性封装  /// 图片标题是否显示  var hiddenTitle:Bool {   get{ return _hiddenTitle;}   set{    _hiddenTitle = newValue;    if noteTitle != nil {     self.noteTitle?.hidden=_hiddenTitle;    }   }  }  /// 图片标题颜色  var colorTitle:UIColor{   get{ return _colorTitle}   set{    _colorTitle = newValue;    if noteTitle != nil {     self.noteTitle?.textColor=_colorTitle;    }   }  }  /// 是否显示 UIPageControl  var hiddenPageControl:Bool{   get{return _hiddenPageControl}   set{    _hiddenPageControl = newValue;    if pageControl != nil {     self.pageControl?.hidden=_hiddenPageControl;    }   }  }  /// UIPagerControl 显示位置  var contentHorizontalAlignment:UIControlContentHorizontalAlignment{   get{ return _contentHorizontalAlignment }   set{    _contentHorizontalAlignment = newValue;    let size:CGSize =   self.pageControl!.sizeForNumberOfPages(pageSize)    switch _contentHorizontalAlignment {    case   UIControlContentHorizontalAlignment.Center :     self.pageControl?.center=CGPointMake(self.center.x, self.frame.size.height-self.titleHeight+self.titleHeight/2)     break;    case UIControlContentHorizontalAlignment.Left :     self.pageControl?.frame.origin.x=size.width/2;     break;    case UIControlContentHorizontalAlignment.Right :     self.pageControl?.frame.origin.x=self.frame.size.width-size.width/2     break;    default:     break;    }   }  }  /// 计时器  var startTimer:Bool{   get{ return _startTimer}   set{    _startTimer = newValue;    if _startTimer {     NSTimer.scheduledTimerWithTimeInterval(_timeInterval, target: self, selector: Selector("runTimePage"), userInfo: nil, repeats: true);    }   }  } } 
View Code

调用代码:

var headerView:KYScrollPage? = KYScrollPage(frame: CGRectMake(0, 0, self.view.frame.size.width, 150)); headerView?.contentHorizontalAlignment=UIControlContentHorizontalAlignment.Right;  headerView?.hiddenTitle=false;  headerView?.startTimer=true;  headerView!.loadData(["http://img0.bdstatic.com/img/image/b4ff47b072b4b8934864f4be92ee07c01409737708.jpg","http://f.hiphotos.baidu.com/image/w%3D230/sign=17e661b9eb50352ab161220b6343fb1a/8435e5dde71190ef5bd3fcd1cc1b9d16fdfa6097.jpg","http://f.hiphotos.baidu.com/image/w%3D230/sign=17e661b9eb50352ab161220b6343fb1a/8435e5dde71190ef5bd3fcd1cc1b9d16fdfa6097.jpg","http://f.hiphotos.baidu.com/image/w%3D230/sign=17e661b9eb50352ab161220b6343fb1a/8435e5dde71190ef5bd3fcd1cc1b9d16fdfa6097.jpg","http://f.hiphotos.baidu.com/image/w%3D230/sign=17e661b9eb50352ab161220b6343fb1a/8435e5dde71190ef5bd3fcd1cc1b9d16fdfa6097.jpg","http://f.hiphotos.baidu.com/image/w%3D230/sign=17e661b9eb50352ab161220b6343fb1a/8435e5dde71190ef5bd3fcd1cc1b9d16fdfa6097.jpg","http://f.hiphotos.baidu.com/image/w%3D230/sign=17e661b9eb50352ab161220b6343fb1a/8435e5dde71190ef5bd3fcd1cc1b9d16fdfa6097.jpg"], title: ["成龙1","成龙2","成龙2","成龙2","成龙2","成龙2","成龙2"]);      headerView?.deleagte=self;    self.tableView.tableHeaderView=headerView; 

三、问题总结

开始做的时候确实遇到了几个问题

1、 属性封装的问题

由于oc 用习惯了总以为 每个属性都有一个默认的字段 _属性 所以在 get{return ...} 花费了些时间

set{_属性=....} 不晓得默认的字段名称花费了些时间

swift 的属性应该是和java 很像。对应定义一个私有成员变量。

2、类型不匹配的问题

由于不明白 ? ! 怎么使用 总是会遇到类型转换不匹配

等号右边的报错通常需要对不一致的类型进行强转 、对于?标示的要 使用 ! 取值。

3、初始值的问题

变量、属性 声明后没有赋值或者标示为 ? 在构造函数总是报错。swift 变量、属性必须初始化。

正文到此结束
Loading...