教你轻松实现类似于微信的左右拖动效果,用swift进行代码编写,快来和小菜鸟一起研究这种效果的教程吧。将使用图文来进行展示
1、效果图
2、创建项目总览图
3、视图文件ViewController.swift文件源码
//
// ViewController.swift
// WBweixinCell
//
// Created by wangBin on 15/10/22.
// Copyright ? 2015年 WB. All rights reserved.
//
import UIKit
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
override func viewDidLoad() {
super.viewDidLoad()
let tableView=UITableView(frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height))
tableView.delegate=self
tableView.dataSource=self
tableView.separatorStyle=UITableViewCellSeparatorStyle.SingleLineEtched
self.view.addSubview(tableView)
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{
return 100.0;
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return 5;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cellIndentifier:String="cellIndenttifier"
let cell=WBTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellIndentifier)
cell.selectionStyle=UITableViewCellSelectionStyle.None
cell.userInteractionEnabled=true
return cell;
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
}
}
复制代码
4、自定义cell,WBTableViewController.swift文件源码
//
// WBTableViewCell.swift
// WBweixinCell
//
// Created by WB on 15/10/22.
// Copyright ? 2015年 WB. All rights reserved.
//
import UIKit
class WBTableViewCell: UITableViewCell{
var View1=UIView(frame: CGRectMake(0, 0,0, 0))
var View2=UIView(frame: CGRectMake(0, 0,0, 0))
var View3=UIView(frame: CGRectMake(0, 0,0, 0))
let panGesture = UIPanGestureRecognizer(target: nil, action: "ViewPan:")
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.backgroundColor=UIColor.grayColor()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//MARK:布局视图
override func layoutSubviews() {
View1.backgroundColor=UIColor.yellowColor()
self.addSubview(View1)
View1.frame = CGRectMake(self.frame.size.width-90, 0,90, self.frame.size.height-1)
View2.backgroundColor=UIColor.greenColor()
self.addSubview(View2)
View2.frame = CGRectMake(self.frame.size.width-180, 0,90, self.frame.size.height-1)
View3.backgroundColor=UIColor.orangeColor()
panGesture.addTarget(self, action: "ViewPan:")
panGesture.delegate=self
View3.frame = CGRectMake(0, 0,self.frame.size.width, self.frame.size.height-1)
View3.addGestureRecognizer(panGesture)
self.addSubview(View3)
}
var begainLeftPan:Bool=false
//拖动开始判断是竖直拖动?
override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool
{
let translation = panGesture.translationInView(self)
if(fabs(translation.y) > fabs(translation.x))
{
return false
}
return true
}
//MARK:拖动手势
func ViewPan(sender:UIPanGestureRecognizer){
let translation : CGPoint = sender.translationInView(self)
if(sender.state == UIGestureRecognizerState.Began)
{
if(translation.x<0)
{
if(View3.center.x + translation.x < self.frame.size.width/2-180)
{
return;
}
begainLeftPan = true//确定视图是向左滑动
View3.center=CGPointMake(View3.center.x + translation.x, View3.center.y )
}
else
{
if(View3.center.x + translation.x < self.frame.size.width/2)
{
View3.center=CGPointMake(View3.center.x + translation.x, View3.center.y )
}
}
}
if(sender.state == UIGestureRecognizerState.Changed)
{
if(begainLeftPan)
{
if(translation.x < -180)//如果偏移量小于最小值,将视图固定最小值并停止继续滑动
{
View3.center=CGPointMake(self.frame.size.width/2-180, View3.center.y )
return
}
if(View3.center.x < self.frame.size.width/2-180)//但是图位置最小值时停止继续滑动
{
return
}
if(View3.center.x + translation.x < self.frame.size.width/2-180)//当位置不是最小值,但加上此次偏移量小于最小值,视图固定最小值否,则继续滑动
{
View3.center=CGPointMake(self.frame.size.width/2-180, View3.center.y )
}
else
{
View3.center=CGPointMake(View3.center.x + translation.x, View3.center.y )
}
if(View3.center.x + translation.x > self.frame.size.width/2)
{
View3.center=CGPointMake(self.frame.size.width/2, View3.center.y )
begainLeftPan = false
}
}
}
if(sender.state == UIGestureRecognizerState.Ended)
{
if(View3.center.x + translation.x < self.frame.size.width/2-180)
{
begainLeftPan = false
}
if(View3.center.x + translation.x <= self.frame.size.width/2-90)
{
View3.center=CGPointMake(self.frame.size.width/2-180, View3.center.y )
}
else
{
View3.center=CGPointMake(self.frame.size.width/2, View3.center.y )
}
}
sender.setTranslation(CGPointMake(0, 0), inView: self)
}
}
复制代码