实现 instagram 底部d出菜单的一个例子(模拟 instagram 系列)

实现 instagram 底部d出菜单的一个例子(模拟 instagram 系列),第1张

概述原文链接:实现 instagram 底部d出菜单的一个例子(模拟 instagram 系列) 模拟 instagram 项目源码:github 仓库:模拟 instagram 聊胜于无,最近有点低潮期的感觉,但是得坚持下去。写不动代码了,所以写一篇简单的总结。 目标和成果 instagram 截图如下: 成果如下: 要实现的内容: 黑色半透明遮罩层 d出动画 点击取消按钮或者背景菜单收回 思路 应

原文链接:实现 instagram 底部d出菜单的一个例子(模拟 instagram 系列)
模拟 instagram 项目源码:github 仓库:模拟 instagram
聊胜于无,最近有点低潮期的感觉,但是得坚持下去。写不动代码了,所以写一篇简单的总结。

目标和成果

instagram 截图如下:

成果如下:

要实现的内容:

黑色半透明遮罩层

d出动画

点击取消按钮或者背景菜单收回

思路

应该是有一种跟 UIPresentationController 有关的解决方法,但是我还不会,所以这次不用。

之前在模拟微博的项目里也用到了d出层,所以我想这次也义勇和上次同样的方式,在 TabbarController 里面添加 subvIEw。

但有两点不同:

上次是点击 tabbarItem 来执行d出,这次要点击第一个 tab 页里的按钮。怎么样让 TabbarController 得到消息?

上次d出的按钮是独立的,这次d出的菜单和指定的图片有关。所以需要有一个标志记录当前点击的是哪一张图片的 more 按钮。

解决方案 Part.1 创建菜单视图

在 storyboard 拖进一个 VIEwController,添加好内容,设置好约束。如图:

注意,这个 VIEwController 的 root vIEw 要讲背景设置为 黑色、透明度 30%,以模拟遮罩层。

新建一个视图文件 BottomMenuVIEw.swift,继承 UIVIEwController。修改刚才新建的 VIEwController 类为 BottomMenuVIEw,并设置 StoryboardID 为”BottomMenu”。

关联好 IBOutlet 对象和点击事件。

import Foundationimport UIKitclass BottomMenuVIEw: UIVIEwController {    @IBOutlet weak var menuBgVIEw: UIVIEw!    @IBOutlet weak var reportBtn: UIbutton!    @IBOutlet weak var sharetoFacebookBtn: UIbutton!    @IBOutlet weak var tweetBtn: UIbutton!    @IBOutlet weak var copyURLBtn: UIbutton!    @IBOutlet weak var noticeBtn: UIbutton!    @IBOutlet weak var dismissBtn: UIbutton!    @IBOutlet weak var buttonPanel: UIVIEw!        overrIDe func vIEwDIDLoad() {        super.vIEwDIDLoad()    }        overrIDe func vIEwDIDAppear(animated: Bool) {        //这里是设置颜色、按钮边框形状。        let maskPathAllCorner = UIBezIErPath(roundedRect: noticeBtn.bounds,byRoundingCorners: [.Bottomleft,.Bottomright,.topleft,.topRight],cornerRadii: CGSize(wIDth: 5,height: 5.0))        let maskPathtopCorner = UIBezIErPath(roundedRect: noticeBtn.bounds,byRoundingCorners: [.topleft,height: 5.0))        let maskPathBottomCorner = UIBezIErPath(roundedRect: noticeBtn.bounds,.Bottomright],height: 5.0))        let shapeAllCorner = CAShapeLayer()        shapeAllCorner.path = maskPathAllCorner.CGPath        let shapetopCorner = CAShapeLayer()        shapetopCorner.path = maskPathtopCorner.CGPath        let shapeBottomCorner = CAShapeLayer()        shapeBottomCorner.path = maskPathBottomCorner.CGPath                reportBtn.layer.mask = shapetopCorner        noticeBtn.layer.mask = shapeBottomCorner        dismissBtn.layer.mask = shapeAllCorner    }    @IBAction func bgTapped(sender: UITapGestureRecognizer) {        //给背景 vIEw 添加一个点击事件        //当点击时,让菜单收回    }    @IBAction func dismissBtnpressed(sender: UIbutton) {            //点击事件,当点击时,让菜单收回    }}

在 TabbarVIEwController.swift 中,修改 vIEwDIDLoad 方法:

overrIDe func vIEwDIDLoad() {    super.vIEwDIDLoad()        self.tabbar.tintcolor = UIcolor.whitecolor()    for it in self.tabbar.items! {        it.badgeValue = "100"    }        self.delegate = self        //找到对应视图,并添加为 TabbarVIEw 的子视图。子视图默认 Alpha 值为0。    //这样每次只用修改 Alpha 值来显示和隐藏,不用重新添加子视图。    self.bottomMenu = self.storyboard?.instantiateVIEwControllerWithIDentifIEr("BottomMenu") as! BottomMenuVIEw    self.bottomMenu.modalTransitionStyle = .CoverVertical    self.vIEw.addSubvIEw(self.bottomMenu.vIEw)    self.bottomMenu.vIEw.Alpha = 0}
解决方案 Part.2 给 TabbarController 传递消息

因为 more 按钮在 tab 页的 vIEwController 里面,我们暂时没办法直接执行 TabbarController 里面的函数,或者对它的 vIEw 进行 *** 作,所以要想个办法发送通知。

发送通知当然是用 NSNotification。

发送显示菜单通知

在 firstVIEwController (即第一个 tab 页的 controller)中添加 more 按钮点击事件,在里面发送一个通知。

@IBAction func morebuttonpressed(sender: UIbutton) {    NSNotificationCenter.defaultCenter().postNotification(NSNotification(name: "ShowBottomMenu",object: sender.tag))}

在这个通知里面,object 是当前按钮的 tag 值。这是在每个 cell 初始化的时候,给当前 cell 的每个 button 的 tag 赋值为当前图片的 ID,保证之后能够判断每个点击事件来自哪个 cell/图片。

发送收回菜单通知

回到 BottomMenuVIEw.swift,在两个点击事件添加发送通知:

@IBAction func bgTapped(sender: UITapGestureRecognizer) {    NSNotificationCenter.defaultCenter().postNotification(NSNotification(name: "dismissBottomMenu",object: nil))}@IBAction func dismissBtnpressed(sender: UIbutton) {        NSNotificationCenter.defaultCenter().postNotification(NSNotification(name: "dismissBottomMenu",object: nil))}

接收通知

在 TabbarVIEwController.swift 的 vIEwDIDLoad 方法中添加一下两行用于接收通知:

NSNotificationCenter.defaultCenter().addobserver(self,selector: "showBottomMenu:",name: "ShowBottomMenu",object: nil)NSNotificationCenter.defaultCenter().addobserver(self,selector: "dismissBottomMenu:",name: "dismissBottomMenu",object: nil)

经过上面的步骤,TabbarVIEwController 就能接收到显示或者收回底部菜单的通知了。然后我们可以在自定义的函数里面编写显示和隐藏的动画。

解决方案 Part.3 显示/收回菜单动画

这部分很简单啦。

func showBottomMenu(notification: NSNotification) {    //获取当前 section ID    let tag = notification.object as! Int    print(tag)        self.bottomMenu.buttonPanel.frame.origin.y = self.vIEw.frame.height    UIVIEw.animateWithDuration(0.3) { () -> VoID in        self.bottomMenu.vIEw.Alpha = 1        self.bottomMenu.buttonPanel.frame.origin.y = self.vIEw.frame.height - self.bottomMenu.buttonPanel.frame.height    }}func dismissBottomMenu(notification: NSNotification) {    print(notification.object)    UIVIEw.animateWithDuration(0.3) { () -> VoID in        self.bottomMenu.vIEw.Alpha = 0        self.bottomMenu.buttonPanel.frame.origin.y = self.vIEw.frame.height    }}

在 showBottomMenu 方法中,获取到了一个 tag 值,这个是留着将来编写对应的菜单按钮点击事件的。

总结

以上是内存溢出为你收集整理的实现 instagram 底部d出菜单的一个例子(模拟 instagram 系列)全部内容,希望文章能够帮你解决实现 instagram 底部d出菜单的一个例子(模拟 instagram 系列)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1077943.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存