模仿网易新闻客户端的滚动菜单
模仿网易新闻客户端的滚动菜单,点击菜单的时候有放大标题的动画效果。demo地址:https://github.com/BigHub/ScrollMenuViewTest
需要用到facebook的开源动画引擎pop 实现代码:
JWSegmentMenuView.swift
1 // 2 // JWSegmentMenuView.swift 3 // ScrollMenuViewTest 4 // 5 // Created by jianwei on 15/8/11. 6 // Copyright (c) 2015年 Jianwei. All rights reserved. 7 // 8 9 import UIKit 10 11 @objc protocol JWSegmentMenuViewDelegate{ 12 optional func selectItem(index:Int); 13 } 14 15 class JWSegmentMenuView: UIScrollView { 16 //MARK: - 代理 17 weak var segmentMenuViewDelegate:JWSegmentMenuViewDelegate? 18 19 //MARK: 选中的item 20 var seletedItem:JWSegmentMenuItem?{ 21 didSet{ 22 23 var scaleAnimation = POPBasicAnimation(propertyNamed: kPOPViewScaleXY) 24 scaleAnimation.duration = 0.2 25 scaleAnimation.toValue = NSValue(CGPoint: CGPointMake(1.0, 1.0)) 26 oldValue?.pop_addAnimation(scaleAnimation, forKey: "scaleAnimation") 27 oldValue?.selected = false 28 oldValue?.showBorderLine = false 29 30 var scaleAnimation2 = POPBasicAnimation(propertyNamed: kPOPViewScaleXY) 31 scaleAnimation2.duration = 0.2 32 scaleAnimation2.toValue = NSValue(CGPoint: CGPointMake(1.3, 1.3 )) 33 seletedItem?.pop_addAnimation(scaleAnimation2, forKey: "scaleAnimation2") 34 seletedItem?.selected = true 35 seletedItem?.showBorderLine = true 36 37 let index = (self.subviews as NSArray).indexOfObject(seletedItem!) 38 let previousIndex = index-1 39 let nextIndex = index + 1 40 41 var visibleRect:CGRect? 42 if previousIndex >= 0 && nextIndex < titlesArray!.count { 43 var preItem = self.subviews[previousIndex] as! JWSegmentMenuItem 44 var nextItem = self.subviews[nextIndex] as! JWSegmentMenuItem 45 visibleRect = CGRectMake(preItem.frame.origin.x, preItem.frame.origin.y, preItem.frame.size.width + nextItem.frame.size.width + seletedItem!.frame.size.width, preItem.frame.size.height) 46 }else if previousIndex < 0 || nextIndex >= titlesArray?.count { 47 visibleRect = seletedItem!.frame 48 } 49 50 self.scrollRectToVisible(visibleRect!, animated: true) 51 } 52 } 53 54 //MARK: 菜单名称列表 55 var titlesArray:NSArray?{ 56 didSet{ 57 58 if oldValue?.count > 0 { 59 (self.subviews as NSArray).enumerateObjectsUsingBlock({ (obj:AnyObject!, index:Int, stop:UnsafeMutablePointer<ObjCBool>) -> Void in 60 (obj as! UIButton).removeFromSuperview() 61 }) 62 } 63 64 if let titles = titlesArray { 65 var x:CGFloat = 0 66 titles.enumerateObjectsUsingBlock({ (obj:AnyObject!, index:Int, stop:UnsafeMutablePointer<ObjCBool>) -> Void in 67 var button:JWSegmentMenuItem = JWSegmentMenuItem.buttonWithType(UIButtonType.Custom) as! JWSegmentMenuItem 68 button.titleLabel?.font = UIFont.boldSystemFontOfSize(16) 69 print(button.titleLabel!.frame) 70 button.titleLabel?.frame = button.bounds 71 print(button.titleLabel!.frame) 72 button.setTitle(obj as? String, forState: UIControlState.Normal) 73 button.setTitleColor(self.menuTitleColor, forState: UIControlState.Normal) 74 button.setTitleColor(self.menuTitleTintColor, forState: UIControlState.Selected) 75 button.addTarget(self, action: "selectItem:", forControlEvents: UIControlEvents.TouchUpInside) 76 var str = NSString(string: obj as! String) 77 var size = str.sizeWithAttributes([NSFontAttributeName:UIFont(name: button.titleLabel!.font.fontName, size: button.titleLabel!.font.pointSize)!]) 78 size.width += 20 79 size.height = self.frame.size.height 80 button.frame = CGRectMake(x, 0.0 as CGFloat, size.width, size.height) 81 x += size.width 82 self.addSubview(button) 83 }) 84 self.contentSize = CGSizeMake(x, self.frame.size.height) 85 } 86 } 87 } 88 89 //MARK: 菜单背景色 90 var menuBackgroundColor:UIColor = UIColor(red: 172/255.0, green: 220/255.0, blue: 30/255.0, alpha: 1) 91 { 92 didSet{ 93 self.backgroundColor = menuBackgroundColor 94 } 95 } 96 97 //MARK: 菜单名称字体颜色 98 var menuTitleColor:UIColor? 99 { 100 didSet{ 101 for item in self.subviews { 102 if item is JWSegmentMenuItem { 103 (item as! JWSegmentMenuItem).setTitleColor(menuTitleColor, forState: UIControlState.Normal) 104 } 105 } 106 } 107 } 108 109 //MARK: 菜单被选中时的名称字体颜色 110 var menuTitleTintColor:UIColor? 111 { 112 didSet{ 113 for item in self.subviews { 114 if item is JWSegmentMenuItem { 115 (item as! JWSegmentMenuItem).setTitleColor(menuTitleTintColor, forState: UIControlState.Selected) 116 } 117 } 118 119 } 120 } 121 122 //MARK: 菜单背景的下划线颜色 123 var menuBackgroundUnderlineColor:UIColor = UIColor.lightGrayColor() 124 { 125 didSet{ 126 self.setNeedsDisplay() 127 } 128 } 129 130 131 override init(frame:CGRect){ 132 super.init(frame: frame) 133 self.showsHorizontalScrollIndicator = false 134 self.showsVerticalScrollIndicator = false 135 self.backgroundColor = menuBackgroundColor 136 menuTitleTintColor = UIColor.redColor() 137 menuTitleColor = UIColor.whiteColor() 138 } 139 140 required init(coder aDecoder: NSCoder) { 141 fatalError("init(coder:) has not been implemented") 142 } 143 144 // override func drawRect(rect: CGRect) { 145 // let underLinePath = UIBezierPath() 146 // underLinePath.moveToPoint(CGPointMake(0, self.frame.size.height)) 147 // underLinePath.addLineToPoint(CGPointMake(self.frame.size.width, self.frame.size.height)) 148 // underLinePath.lineWidth = 4 149 // menuBackgroundUnderlineColor.set() 150 // underLinePath.stroke() 151 // } 152 153 //MARK: - 选中item触发的方法 154 func selectItem(item:JWSegmentMenuItem){ 155 seletedItem = item 156 segmentMenuViewDelegate?.selectItem!((self.subviews as NSArray).indexOfObject(seletedItem!)) 157 } 158 159 } 160 161 class JWSegmentMenuItem: UIButton { 162 //MARK: 是否显示菜单item的下划线 163 var showBorderLine:Bool = false { 164 didSet{ 165 self.setNeedsDisplay() 166 } 167 } 168 169 // override func drawRect(rect: CGRect) { 170 // if showBorderLine { 171 // let path = UIBezierPath(); 172 // path.moveToPoint(CGPointMake(0, self.frame.height)) 173 // path.addLineToPoint(CGPointMake(self.frame.width, self.frame.height)) 174 // path.lineWidth = 6 175 // titleColorForState(UIControlState.Selected)?.set() 176 // path.stroke() 177 // } 178 // } 179 180 }
使用:
ViewController.swift
// // ViewController.swift // ScrollMenuViewTest // // Created by jianwei on 15/8/10. // Copyright (c) 2015年 Jianwei. All rights reserved. // import UIKitclass ViewController: UIViewController,JWSegmentMenuViewDelegate {@IBOutlet weak var textLabel: UILabel!var segmentView:JWSegmentMenuView?lazy var titlesArray:[String] = {return ["按钮一","按钮二","按钮","按钮四","按钮五","按钮六","按钮七","按钮八","按钮九","按钮十","按钮十一","按钮十二","按钮十三"]}()override func viewDidLoad() {super.viewDidLoad()segmentView = JWSegmentMenuView(frame: CGRectMake(0, 20, self.view.frame.size.width, 33))segmentView?.titlesArray = titlesArraysegmentView?.segmentMenuViewDelegate = selfself.view.addSubview(segmentView!)}//MARK: - JWSegmentMenuViewDelegate func selectItem(index: Int) {textLabel.text = titlesArray[index]} }
转载于:https://www.cnblogs.com/mysticode/p/4723483.html
模仿网易新闻客户端的滚动菜单相关推荐
- 模仿网易新闻客户端(RSS版)(二)
一.摘要 继上一篇博客<模仿网易新闻客户端(一)>之后,笔者继续开发我们自己的"网易新闻客户端",由于找不到现成的url新闻链接地址,所以这里就用RSS订阅所提供的ur ...
- 模仿网易新闻客户端(RSS版)(一)
一.摘要 这几天找工作闲来没事,偶然在一个论坛上面看到有人模拟网易新闻客户端首页顶部那个组件效果,一时兴起,也来自己动手完整地模拟一个,包括顶部的特效组件和底部的类似于TabHost的组件.下面就动手 ...
- Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了提高兴趣,咱们开头先看看最终要实现什么样的效果: 侧拉菜单在Android应用中非常常见,它的实现方式太多了,今天我们就说说使用G ...
- Android SlidingMenu 仿网易新闻客户端布局
前面两篇文章中的SlidingMenu都出现在左侧,今天来模仿一下网易新闻客户端左右两边都有SlidingMenu的效果,以下是网易新闻客户端效果: 不扯闲话了,直接进入正题吧 frame_conte ...
- Android组件——使用DrawerLayout仿网易新闻v4.4侧滑菜单
转载请注明出处: http://blog.csdn.net/allen315410/article/details/42914501 概述 今天这篇博客将记录一些关于DrawerLayout的基本用法 ...
- Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherl ...
- Android高仿网易新闻客户端之首页
关于实现网易新闻客户端的界面,以前写过很多博客,请参考: Android实现网易新闻客户端效果 Android实现网易新闻客户端侧滑菜单(一) Android实现网易新闻客户端侧滑菜单(二) 今天用V ...
- Toolbar+DrawerLayout高仿网易新闻客户端
首先看效果图,网易新闻客户端的特点是双向侧滑,并且左上角的图标会随着菜单的侧滑会有动画效果. 我们采用Toolbar和DrawerLayout实现双向侧滑以及actionbar 在菜单文件里先定义菜单 ...
- 用户一亿的网易新闻客户端质量如何?
网易新闻客户端(3.5.0)新版发布,据官方宣称目前这款应用用户数量已突破1.2亿,这款新闻客户端凭借其网络媒体背景,因其使用感官最流畅.新闻发布最快速.评论最犀利而备受推崇.被誉为有态度网友的一致选 ...
最新文章
- 仿射密码介绍以及解题脚本
- eclipse创建了java web项目后怎么连接mysql
- 耗尽您CPU资源的Explored病毒清除法
- 面向对象之三大特性:继承,封装,多态
- 做可交互的统计图表,这套图形语法不容错过
- webserver之定时器
- 疯传短视频V7.10小程序源码
- 存储过程测试dbms、lpad与chr(10)
- xargs命令和find的-exec
- webrender 查看是否开启_查看端口是否启用
- 轮询、前后台和多任务系统软件模型区别
- linux使用RAM_DISK根文件系统基本过程
- 生活娱乐 长的最奇怪的东西——骡耳犰狳
- Android毕设项目功能:商城列表与购物车展示(一)
- 碰撞检测经典解决方案
- 关于Github项目DCRNN运行问题小结(1)——tables模块包
- cpu消耗 pytorch_PyTorch测试模型执行计算耗费的时间
- 2017西安网络赛B_Coin
- 未命名文章图灵奖Yann LeCun团队提出Masked Siamese ConvNets,让Mask策略也能应用于基于ViT的孪生网络,进行自监督学习!
- 获得代理ippython_Python爬虫代理IP从哪里获取?
热门文章
- 聚类算法详解——深度AI科普团队
- clion windows安装
- java属于以下哪种语言_Java属于以下哪种语言?
- smb 限制大文件上传_单个文件大小 上传百度云盘 微信发送 有大小限制 怎么破?...
- python卷积函数_python – 理解Scipy卷积
- vue文件里在style的样式需要什么loader_Vue学习笔记之Webpack中css、less、图片等文件处理...
- Android SDK实例之Snake游戏深入解析(一)
- android编程fragment,详解Android中Fragment的两种创建方式
- 近一个月来的学习总结(今天的你比昨天的你进步了吗?)
- ES6-改变对象的原型对象