一:今天讲解最后一个模块,老规矩,附上效果图
修改前的图:
用的系统的的BarButtonItems,导致间距无法修改,但是如果不用系统的,就相对麻烦很多很多,所以在导航栏这条我想到一个办法就是在中间添加一个空的BarButton,但是
问题来了,如何让这个添加的空的BarButton没有点击事件,也就是点击时没有反应,就像不存在一样,是的,enabled能解决,说了这么多,原理就是这个原理,但我没用这么笨拙的方法。
代码:
let ringht1 = UIBarButtonItem.init(icon: "mine-setting-icon", highIcon: "mine-setting-icon-click", target: self, action: "right1")
ringht1.customView?.width = 20
let ringht2 = UIBarButtonItem.init(icon: "mine-moon-icon", highIcon: "mine-moon-icon-click", target: self, action: "right2")
ringht2.customView?.width = 20
//增加一个有一定宽度的UIBarButtonItem 调整间距
let bar = UIBarButtonItem.init(barButtonSystemItem: .FixedSpace, target: nil, action: nil)
bar.width = 20
navigationItem.rightBarButtonItems = [ringht1,bar,ringht2]
最终效果:
现在说说其余功能点,看到cell,可能有人想到了静态cell,但是我这里没用xib,我是改变cell的Image及Lable的frame
主要代码:
//重写布局 修改frame
override func layoutSubviews() {
super.layoutSubviews()
if (self.imageView!.image == nil){
return
}
self.imageView!.width = 30
self.imageView!.height = 30
self.imageView!.centerY = self.contentView.height * 0.5
self.textLabel!.x = CGRectGetMaxX(self.imageView!.frame) + 10
}
当然这是针对前两个cell,对于自拍和我是段子手这样的cell,我没打算重新创建一个cell,而是在原有cell中添加两个UIButton,每个button占据一半宽,高为44
关键代码:
cell?.addSubview(bthLeft)
cell?.addSubview(btnRight)
关键代码:
//尾部 是单独的view 写一个继承View的类
self.tableView.tableFooterView = Footer.init(frame: CGRectZero)
请求数据获取到了之后就将数据传递给xib创建的button,直接将数据赋值就ok,
在footer中得关键代码:
let maxCols:CGFloat = 4
//等宽
let buttonW = screen_width / maxCols
let buttonH = buttonW
for i in 0 ..< FootArr.count{
let but = XYfootBut.footBut() as! XYfootBut
//设置frame
let col = CGFloat(i) % maxCols
let row = i / Int(maxCols)
but.frame = CGRectMake(col * buttonW, CGFloat(row) * buttonH, buttonW, buttonH)
XYDEBUG(but.frame)
if (i == 12){
let footBut = NSBundle.mainBundle().loadNibNamed("XYfootBut", owner: nil, options: nil) as NSArray
let but = footBut.lastObject as! XYfootBut
but.frame = CGRectMake(col * buttonW, CGFloat(row) * buttonH, buttonW, buttonH)
self.addSubview(but)
return
}
but.footModel = creatButton[i] as? XYFootModel
self.addSubview(but)
}
其实个人觉得这个模块是最简单的,因为没有太多的细节考虑,唯一的点就是 BarButton的间距问题。
二:精华模块中还有一个比较重要的就是标签订阅,
效果图:
这个模块我主要是讲解点击搜索的时候,导航栏直接隐藏,搜索框直接置顶,出现一个蒙盖,因为没有搜索模块的api所以没做,只是将效果做出来了,
分享:当点击搜索控件,就走了他的代理方法,所以我们肯定是在代理方法中执行,
这个蒙盖我们可以当做是一个半透明的按钮,最开始是隐藏的,走了代理就显示出来,
在搜索框编辑时,就应该添加了一个子控制器,因为搜索的结果要显示,所以子控制器就办了这件事,
关键代码:
//开始编辑
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
self.navigationController?.setNavigationBarHidden(true, animated: true)
UIView.animateWithDuration(0.6) { () -> Void in
self.covnBut.alpha = 0.6
}
}
代码:
var searchRestlt:XYSubSearchResult?{
get{
let searchRestlt = XYSubSearchResult()
addChildViewController(searchRestlt)
_searchRestlt = searchRestlt
self.view.addSubview(searchRestlt.view)
//约束 到其父view上左下右的间距
// let layoutMo = _searchRestlt!.view.sd_layout() as SDAutoLayoutModel
// layoutMo.leftSpaceToView(view,10)
// .topSpaceToView(view, -64)
return searchRestlt
}set(Restlt ){
_searchRestlt = Restlt
}
}
这就是添加了一个子控制的代码,在编辑代理方法中添加这个子控制,然后将输入的数据传递给这个子控制器,然后通过这个数据加载API数据,也就是搜索数据
代码:
/**
* 搜索框里面的文字变化的时候调用
*/
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if (searchText.isEmpty) {
self.searchRestlt!.view.hidden = true
} else {
self.searchRestlt!.view.hidden = false
self.searchRestlt!.searchText = searchText;//将输入的值进行匹配查询
}
}
这是我的项目 地址