网易新闻练习
网易新闻
从架构上来看, 史一个根控制器上有两个侧边视图, 还要一个导航控制器来显示主页, 之后回有更多的控制器, 点击跳转过去
左边视图的设计: view上创建几个按钮, (可以将按钮的创建方法封装起来, 创建按钮操作很频繁) 设置好大小和距离, 内容边距. 关于按钮背景色史选中才出现, 关于状态只能用image, 所以要用CG来创建一个纯色的图片返回来用
同样的在自己用的控制器要封装起来 关于title可以将一个button封装起来, 在本项目的其他的控制器中可以重复使用, 只是标题不同嘛
点击显示左边菜单: 新闻控制器view应该右滑和菜单贴边高度一样, 要注意缩放时回将平移距离也缩放了, 要乘回来, 计算平移的距离比较麻烦
控制器的切换:
在点击按钮的时候, 传出按钮的tag给代理, main控制器移除原来的控制器.view, add新的控制器.view
可以尝试设置一个showView属性, 切换时就切换showView所指的控制器, 不过要想同时看到隐藏一个显示一个的效果的化, 就不能这样
將設置子控制器抽出來放到main控制器里, 可以统一设置子控制器的主题, titleView, 左右按钮等, 并为其包装导航控制器, 添加到自己main控制器的子控制器中, 左右按钮的点击事件拿到main控制器中, 这样就从main控制器的层面来切换子控制器, 就想tabbarController一样
将要移除的控制器的transform赋值给要显示的控制器, 在用动画把transform清空, 就能有动画效果回到原位置
在需要清空transform的时候, 可以直接调用点击遮盖, 等同的效果, 不要重复做
需要对选择view中的按钮做适配, 让它点下去就显示背景, 取消按下高亮状态时系统对按钮做的操作,--自定义按钮中重写hight方法,什么都不做
bug: 当一个导航控制器的View首次显示到其父控件上时, 如果transform的缩放值被改来, 上面的20高度当时是不会出来的 ---- 调换下顺序就可以, 在修改值之前, 先添加到父控件上,
将按钮贴边: 遍历导航栏的子控件, 看按钮的x值来判断左右按钮, 再将按钮的x值更改, 应该在控制器的viewDidLayoutSubViews方法中更改
但是有点问题, 会看到按钮的移动
最终的解决方案: 自定义导航栏替换掉导航控制器自带的导航栏, 用KVC替换, 在自定义导航栏里设置子控件的位置
猜想: 导航栏中item有没有对应的设置来设置缩进位置的
显示右边的菜单:
如果一个view里的业务逻辑比较多比较复杂, 我们可以用一个控制器来管理这些事件, 而不是将view的事件丢给底层的控制器
用xib将右边菜单做出来, 因为相对固定
菜单位置和左边菜单相似, 方向和宽度不一样, 最好用2个属性拥有这两个菜单, 当一个显示时, 另一个隐藏
菜单中图标的 反转:
CATransform矩阵
转场动画transition (之后要把之前项目中的笔记搬到这里来) 从uiview来做的动画比较有限, 更多的化可以用transition这个类来做
按钮点击亮点, 自带的一个属性, showhighlightWhenTouched = yes 就行
bug: CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000 —– This one appears when someone is trying to put nil eventually in [UIImage imageNamed:] 给UIImage imageNamed:nil]传nil的话就会这样….要判断一下
bug: 当transform的时候, 有时候直接make(a,b,c,d)不一定好使, 在相同参数的情况下, 分步来做的结果不一样,
showView.transform = CGAffineTransformMake(scale, 0, 0, scale, -kRightMenuW*scale, 0);
上面这句就和下面的分步结果不一样
CGAffineTransform scaleForm = CGAffineTransformMakeScale(scale, scale);
// 平移
CGAffineTransform translateForm = CGAffineTransformTranslate(scaleForm, -transX / scale, 0);
showView.transform = translateForm;