一、渐变的uiView
iOS中的渐变主要原理其实就是通过CAGradientLayer,将CAGradientLayer添加在我们要设置背景色的视图的layer层,然后设置渐变的位置,在设置颜色的分割点即可,我把它写到了扩展函数中,可供参考
二、UITableView更换背景颜色
方案1,直接修改backgroundColor tableView.backgroundColor = UIColor.black 方案2,通过backgroundView间接修改 let tableViewBackgroud = UIView(frame: tableView.frame) tableViewBackgroud.backgroundColor = UIColor.black tableView.backgroundView = tableViewBackgroud
三、UITableView部分控件点击事件
在开发UITableView时,总会有需求,点击item中的部分布局触发不同的效果,这个时候可以采用点击事件传递的方式进行操作,参考代码如下
typealias FocusItemClick = (_ content : Int,_ type:Int) -> Void
(在外部定义一个类)
contentView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectClick(tap: ))))
(在UITableViewCell内部为需要的view定义点击事件)
@objc func selectClick(tap: UITapGestureRecognizer) { if itemClick != nil { itemClick!(clickIndex,0) } }
(将点击事件传递出去)
cell?.itemClick = {(content : Int,type:Int) -> Void in }
(在UIViewController中的tableView的相关方法中传入点击事件)
四、UITableView不设置backgroundView导致崩溃的坑
在我上一条中提到的处理点击事件的方案,在设置UITableView的背景颜色后会导致崩溃,解决方案是,不设置UITableView的backgroundColor,而是设置backgroundView,灿开代码如下
let tableViewBackgroud = UIView(frame: tableView.frame) tableViewBackgroud.backgroundColor = UIColor.colorWithHexString("#F7F7F7") tableView.backgroundView = tableViewBackgroud
五、textField设置padding
iOS不像安卓开发一样,在定义时可以直接设置padding属性,而是通过内嵌一个view来实现这个功能,参考代码如下
let paddingView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 30)) searchEdit.leftView = paddingView searchEdit.leftViewMode = .always
六、textField监听事件踩坑
textField监听事件的监听事件,查到最常用的用法是
searchEdit.delegate = self
然后在ViewController继承UITextFieldDelegate,然后在textField的相关方法中处理
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { <#code#> }
但是,我发现它获取的值是有问题的,获取的字符串永远是上一个字符串,,比如说当我输入第一个字符串“a”时,获取到的是空字符串,
当我输入第二个字符串“f”时,获取到的是“a”字符串,当我输入第三个字符串“c”时,获取到的是“af”字符串。所以我采用了别的解决方案,参考代码如下:
searchEdit.addTarget(self, action: #selector(keyboardInputShouldDelete(_:)), for: .editingChanged) @objc fileprivate func keyboardInputShouldDelete(_ textField:UITextField){ let text = textField.text?.count ?? 0 <#code#> }
这个方案可以有效的获取当前的字符串