- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章ios仿侧边抽屉效果实现代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
效果图如下 。
代码实现以及思路下面分析: 代码创建导航控制器 appdelegate.m中 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#import "appdelegate.h"
#import "viewcontroller.h"
@interface appdelegate ()
@end
@implementation appdelegate
- (
bool
)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions {
self.window = [[uiwindow alloc] initwithframe:[uiscreen mainscreen].bounds];
viewcontroller * vc = [[viewcontroller alloc] init];
//必须要初始化导航控制器的根控制器
uinavigationcontroller * nav = [[uinavigationcontroller alloc] initwithrootviewcontroller:vc];
self.window.rootviewcontroller = nav;
[self.window makekeyandvisible];
return
yes;
}
|
viewcontroller.m中 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//
// viewcontroller.m
// pbsliedmenu
//
// created by 裴波波 on 16/4/21.
// copyright © 2016年 裴波波. all rights reserved.
//
#import "viewcontroller.h"
#define kscreenh [uiscreen mainscreen].bounds.size.height
#define kscreenw [uiscreen mainscreen].bounds.size.width
#define knavw 64
@interface viewcontroller ()<uitableviewdelegate,uitableviewdatasource>
@property (nonatomic, strong) uitableview *tableview;
/** 记录是否打开侧边栏 */
@property (nonatomic, assign)
bool
openslide;
/** 侧栏按钮 */
@property (nonatomic, strong) uibarbuttonitem *btnleft;
@end
|
用一个bool值来记录左侧view是打开还是关闭状态.每次点击都要改变记录tableview状态的值 用属性保存 侧栏 按钮,用来当左侧tableview正在弹出或者收回执行动画过程中禁用. 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
@implementation viewcontroller
#pragma mark - 选中某个cell代理方法
-(
void
)tableview:(uitableview *)tableview didselectrowatindexpath:(nsindexpath *)indexpath{
uitableviewcell * cell = [tableview cellforrowatindexpath:indexpath];
nslog(@
"%@"
,cell.textlabel.text);
//选中cell后立即取消选中
[tableview deselectrowatindexpath:indexpath animated:yes];
}
#pragma mark - tableview数据源
-(nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section{
return
20;
}
-(uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath{
static
nsstring * id = @
"cell"
;
uitableviewcell * cell = [tableview dequeuereusablecellwithidentifier:id forindexpath:indexpath];
cell.textlabel.text = [nsstring stringwithformat:@
"我是%zd"
,indexpath.row];
cell.backgroundcolor = [uicolor orangecolor];
return
cell;
}
- (
void
)viewdidload {
[super viewdidload];
self.view.backgroundcolor = [uicolor whitecolor];
[self initleftbarbutton];
//注册cell
[self.tableview registerclass:[uitableviewcell
class
] forcellreuseidentifier:@
"cell"
];
}
|
注意:注册cell的同时调用了 self.tableview 则调用了懒加载,此时tableview已经创建了.必须要先创建,否则有一个小bug就是,当tableview第一次弹出的时候会从屏幕的(0,0)点弹出,而不是整个tableview从左侧弹出. 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#pragma mark - 初始化侧栏按钮
-(
void
)initleftbarbutton{
uibutton * btnleft = [[uibutton alloc] init];
btnleft.frame = cgrectmake(0, 0, 90, 40);
[btnleft settitle:@
"侧栏"
forstate:uicontrolstatenormal];
[btnleft settitlecolor:[uicolor blackcolor] forstate:uicontrolstatenormal];
[btnleft addtarget:self action:@selector(didleftbtn) forcontrolevents:uicontroleventtouchupinside];
self.navigationitem.leftbarbuttonitem = [[uibarbuttonitem alloc] initwithcustomview:btnleft];
self.btnleft = self.navigationitem.leftbarbuttonitem;
}
#pragma mark - 懒加载tableview
-(uitableview *)tableview{
if
(_tableview == nil) {
_tableview = [[uitableview alloc] init];
_tableview.delegate = self;
_tableview.datasource = self;
_tableview.backgroundcolor = [uicolor orangecolor];
//第一次点击tableview从左上角弹出,优化方案--先创建出tableview
cgfloat hight = kscreenh;
cgfloat x = 0;
cgfloat y = knavw;
cgfloat width = 0;
_tableview.frame = cgrectmake(x, y, width, hight);
//取消显示竖直滚动条
_tableview.showsverticalscrollindicator = no;
}
return
_tableview;
}
|
懒加载的时候直接创建tableview,让其宽度 == 0 即可. 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#pragma mark - 点击侧栏按钮弹出tableview
-(
void
)didleftbtn{
//禁用button等待动画执行完毕再启用button
self.btnleft.enabled = no;
cgfloat hight = kscreenh;
cgfloat x = 0;
cgfloat y = knavw;
if
(!self.openslide) {
//添加动画
[uiview animatewithduration:0.3 animations:^{
cgfloat width = kscreenw / 3;
self.tableview.frame = cgrectmake(x, y, width, hight);
}];
[self.view addsubview:self.tableview];
}
else
{
[uiview animatewithduration:0.3 animations:^{
cgfloat width = 0;
self.tableview.frame = cgrectmake(x, y, width, hight);
}];
}
//执行完毕动画 取消禁用button
[self performselector:@selector(setbtnleftenabled) withobject:nil afterdelay:0.3];
//监视侧栏是否打开
if
(self.openslide == yes) {
self.openslide = no;
}
else
{
self.openslide = yes;
}
}
|
点击 侧栏 按钮弹出tableview,此过程中让其动画执行,不会显得生硬.让tableview的宽度从0---> 屏幕宽度的三分之一 记录tableview打开的状态. 执行动画的过程中禁用 侧栏 按钮,由于代码执行时间的瞬间完成的,动画执行时间是0.3s,则延迟0.3s取消禁用 侧栏 按钮. 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//不用反复创建tableview
//#pragma mark - 移除tableview
//-(void)removesliedview{
//
// [self.tableview removefromsuperview];
// self.btnleft.enabled = yes;
//}
#pragma mark - 动画执行完毕启用"侧栏"按钮
-(
void
)setbtnleftenabled{
self.btnleft.enabled = yes;
//动画执行完毕让第一个cell显示在最顶端
self.tableview.contentoffset = cgpointmake(0, 0);
}
- (
void
)didreceivememorywarning {
[super didreceivememorywarning];
// dispose of any resources that can be recreated.
}
@end
|
之前犯过一个错误就是点击 侧栏 按钮创建tableview,再点击 销毁 tableview,这样比较耗性能.通过懒加载先创建tableview,收回tableview的时候让其宽度 == 0 即可. 上图演示的可以看出,当滑动tableview的时候,再次点击进去tableview还是滑动的位置,不会恢复到开始 下标为 0 的cell为最上面显示的cell.优化方案:让tableview的偏移contentoffset等于 0即可.代码不能写在 弹出tableview 与 收回 tableview的动画代码中,因为这样会让人看出来.写在动画执行完毕后的代码中. 。
源代码地址:https://git.oschina.net/alexpei/pbsliedmenu.git 。
以上就是本文的全部内容,希望对大家的学习有所帮助.
最后此篇关于ios仿侧边抽屉效果实现代码的文章就讲到这里了,如果你想了解更多关于ios仿侧边抽屉效果实现代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!