模仿网易新闻客户端的滚动菜单,点击菜单的时候有放大标题的动画效果。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

模仿网易新闻客户端的滚动菜单相关推荐

  1. 模仿网易新闻客户端(RSS版)(二)

    一.摘要 继上一篇博客<模仿网易新闻客户端(一)>之后,笔者继续开发我们自己的"网易新闻客户端",由于找不到现成的url新闻链接地址,所以这里就用RSS订阅所提供的ur ...

  2. 模仿网易新闻客户端(RSS版)(一)

    一.摘要 这几天找工作闲来没事,偶然在一个论坛上面看到有人模拟网易新闻客户端首页顶部那个组件效果,一时兴起,也来自己动手完整地模拟一个,包括顶部的特效组件和底部的类似于TabHost的组件.下面就动手 ...

  3. Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了提高兴趣,咱们开头先看看最终要实现什么样的效果: 侧拉菜单在Android应用中非常常见,它的实现方式太多了,今天我们就说说使用G ...

  4. Android SlidingMenu 仿网易新闻客户端布局

    前面两篇文章中的SlidingMenu都出现在左侧,今天来模仿一下网易新闻客户端左右两边都有SlidingMenu的效果,以下是网易新闻客户端效果: 不扯闲话了,直接进入正题吧 frame_conte ...

  5. Android组件——使用DrawerLayout仿网易新闻v4.4侧滑菜单

    转载请注明出处: http://blog.csdn.net/allen315410/article/details/42914501 概述 今天这篇博客将记录一些关于DrawerLayout的基本用法 ...

  6. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

     转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherl ...

  7. Android高仿网易新闻客户端之首页

    关于实现网易新闻客户端的界面,以前写过很多博客,请参考: Android实现网易新闻客户端效果 Android实现网易新闻客户端侧滑菜单(一) Android实现网易新闻客户端侧滑菜单(二) 今天用V ...

  8. Toolbar+DrawerLayout高仿网易新闻客户端

    首先看效果图,网易新闻客户端的特点是双向侧滑,并且左上角的图标会随着菜单的侧滑会有动画效果. 我们采用Toolbar和DrawerLayout实现双向侧滑以及actionbar 在菜单文件里先定义菜单 ...

  9. 用户一亿的网易新闻客户端质量如何?

    网易新闻客户端(3.5.0)新版发布,据官方宣称目前这款应用用户数量已突破1.2亿,这款新闻客户端凭借其网络媒体背景,因其使用感官最流畅.新闻发布最快速.评论最犀利而备受推崇.被誉为有态度网友的一致选 ...

最新文章

  1. 仿射密码介绍以及解题脚本
  2. eclipse创建了java web项目后怎么连接mysql
  3. 耗尽您CPU资源的Explored病毒清除法
  4. 面向对象之三大特性:继承,封装,多态
  5. 做可交互的统计图表,这套图形语法不容错过
  6. webserver之定时器
  7. 疯传短视频V7.10小程序源码
  8. 存储过程测试dbms、lpad与chr(10)
  9. xargs命令和find的-exec
  10. webrender 查看是否开启_查看端口是否启用
  11. 轮询、前后台和多任务系统软件模型区别
  12. linux使用RAM_DISK根文件系统基本过程
  13. 生活娱乐 长的最奇怪的东西——骡耳犰狳
  14. Android毕设项目功能:商城列表与购物车展示(一)
  15. 碰撞检测经典解决方案
  16. 关于Github项目DCRNN运行问题小结(1)——tables模块包
  17. cpu消耗 pytorch_PyTorch测试模型执行计算耗费的时间
  18. 2017西安网络赛B_Coin
  19. 未命名文章图灵奖Yann LeCun团队提出Masked Siamese ConvNets,让Mask策略也能应用于基于ViT的孪生网络,进行自监督学习!
  20. 获得代理ippython_Python爬虫代理IP从哪里获取?

热门文章

  1. 聚类算法详解——深度AI科普团队
  2. clion windows安装
  3. java属于以下哪种语言_Java属于以下哪种语言?
  4. smb 限制大文件上传_单个文件大小 上传百度云盘 微信发送 有大小限制 怎么破?...
  5. python卷积函数_python – 理解Scipy卷积
  6. vue文件里在style的样式需要什么loader_Vue学习笔记之Webpack中css、less、图片等文件处理...
  7. Android SDK实例之Snake游戏深入解析(一)
  8. android编程fragment,详解Android中Fragment的两种创建方式
  9. 近一个月来的学习总结(今天的你比昨天的你进步了吗?)
  10. ES6-改变对象的原型对象