初识 swift 封装轮播图

来源:互联网 时间:1970-01-01

一、简介

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

随着工作走向正规公司的项目不是那么赶、也就有时间尝试一些新的东西。只是不想刚开始编程哪会那么激进今天学这个明天学那个了。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 第三方库

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 变量、属性必须初始化。


相关阅读:
Top