UITableView中多选是非常常见的,我们一般使用系统自带的多选按钮,这个按钮是蓝色的。最近项目里有个需求,某些按钮是默认选中的,并且是灰色的,苦于没有UI设计,只能自己来改变系统的选择按钮了,选择按钮颜色的改变可以参考以前的一篇文章给图片进行颜色渲染。
首先,我们把图片渲染的方法封装起来,方便调用。
import UIKit
class MDMTintImageHelper {
static func tintedImageWithColor(color: UIColor, originalityImage: UIImage!) -> UIImage {
//创建图片位置大小
let imageRect = CGRect(x: 0.0, y: 0.0, width: originalityImage.size.width, height: originalityImage.size.height)
//设置绘制图片上下文
UIGraphicsBeginImageContextWithOptions(imageRect.size, false, originalityImage.scale)
//得到上下文
let context = UIGraphicsGetCurrentContext()
//绘制图片
originalityImage.drawInRect(imageRect)
//设置渲染颜色
CGContextSetFillColorWithColor(context, color.CGColor)
//设置透明度(值可根据需求更改)
CGContextSetAlpha(context, 0.5)
//设置混合模式
CGContextSetBlendMode(context, CGBlendMode.SourceAtop)
//设置位置大小
CGContextFillRect(context, imageRect)
//绘制图片
let imageRef = CGBitmapContextCreateImage(context)
let darkImage = UIImage(CGImage: imageRef!, scale: originalityImage.scale, orientation: originalityImage.imageOrientation)
//完成绘制
UIGraphicsEndImageContext()
return darkImage
}
}
然后,我们自定义一个cell,用来表示已经默认选择的cell。
import UIKit
class MDMSelectedCell: UITableViewCell {
override func layoutSubviews() {
super.layoutSubviews()
for subview in self.subviews {
if subview.isKindOfClass(NSClassFromString("UITableViewCellEditControl")!) {
let imageView = subview.valueForKey("_imageView") as? UIImageView
if imageView != nil {
imageView!.image = MDMTintImageHelper.tintedImageWithColor(UIColor.lightGrayColor(), originalityImage: imageView!.image)
}
}
}
}
}
最后,我们对tableview进行展示,这里默认偶数行是默认选择的。
import UIKit
class MDMViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var tableView: UITableView?
lazy var dataArray: [String] = {
var array = [String]()
for i in 0 ..< 100 {
array.append(String(i))
}
return array
}()
override func viewDidLoad() {
super.viewDidLoad()
tableView = UITableView(frame: self.view.bounds, style: .Plain)
view.addSubview(tableView!)
tableView?.dataSource = self
tableView?.delegate = self
tableView?.registerClass(MDMSelectedCell.classForCoder(), forCellReuseIdentifier: String(MDMSelectedCell.classForCoder()))
tableView?.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: String(UITableViewCell.classForCoder()))
tableView?.editing = true
}
}
extension MDMViewController {
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.row % 2 == 0 {
let cell = tableView.dequeueReusableCellWithIdentifier(String(MDMSelectedCell.classForCoder()), forIndexPath: indexPath)
cell.textLabel?.text = dataArray[indexPath.row]
tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
return cell
} else {
let cell = tableView.dequeueReusableCellWithIdentifier(String(UITableViewCell.classForCoder()), forIndexPath: indexPath)
cell.textLabel?.text = dataArray[indexPath.row]
return cell
}
}
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
return UITableViewCellEditingStyle(rawValue: (1 | 2))!
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.row % 2 == 0 {
tableView .selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
} else {
//TODO 可选中cell选中需进行的操作
}
}
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.row % 2 == 0 {
tableView .selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.None)
} else {
//TODO 可选中cell取消选中需进行的操作
}
}
}
需要注意的是,如果操作类型设置为多选,那么,
tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
这个方法是被屏蔽的。
附属完整代码连接:
Demo地址