仿IOS自定义组合Dialog【GroupDialog】(更新版)
2016-03-16 15:39
721 查看
最近因为项目需要,又重新优化了一下之前的Dialog。这次要分享的是一个更新版的Dialog,项目名称为:GroupDialog。
话不多说,首先来看一下效果图:
以下是该项目涉及到的相关内容:
接下来简单的讲解一个这个项目,首先是xml:
如上图,其实这个Dialog很简单,它是由多个部分根据使用者的需求而组合成不同的面板,而使用方法也是跟安卓系统自带的Dialog相似。使用起来比较容易上手而且UI基本上
都是仿IOS实现的,不会高度定制Dialog的样式,让使用者有比较高度的自由度去组合自己想要的Dialog.
以下是GroupDialog的主要方法:
代码中主要分开UI控件的设置方法与判断的读取控制控件的隐现:
初始化控制控件隐现相关的参数:
控件的设置调用方法:
控件隐现:
最后是该项目调用这个GroupDialog的代码演示:
以上就是该项目的全部实现过程,如有不明或是指出错误地方的朋友也欢迎留言交流。
项目下载
话不多说,首先来看一下效果图:
以下是该项目涉及到的相关内容:
1、新增自定义水平进度条Dialog。 2、新增自定义环形进度条Dialog。 3、新增选择日期Dialog。 4、新增选择时间Dialog。 5、新增标题带有图标的Dialog。 6、优化进度条倒计时使用到的线程。
7、修复一部分bug和显示各个Dialog部件的逻辑。
其中用到的自定义Dialog,来自鸿洋大神的微博:点击打开链接
接下来简单的讲解一个这个项目,首先是xml:
如上图,其实这个Dialog很简单,它是由多个部分根据使用者的需求而组合成不同的面板,而使用方法也是跟安卓系统自带的Dialog相似。使用起来比较容易上手而且UI基本上
都是仿IOS实现的,不会高度定制Dialog的样式,让使用者有比较高度的自由度去组合自己想要的Dialog.
以下是GroupDialog的主要方法:
代码中主要分开UI控件的设置方法与判断的读取控制控件的隐现:
初始化控制控件隐现相关的参数:
private boolean showTitle = false; private boolean showIcon = false; private static boolean showMsg = false; private boolean showPosBtn = false; private boolean showNegBtn = false; private boolean showSelsetPanel = false; private boolean setLeftOnClik = false; private boolean setRightOnClik = false; private boolean showList = false; private boolean showCountDown = false; private boolean showCanclebtn = false; private static boolean showProgressBarHor = false; private static boolean showProgressBarRound = false; private static int progress = 0;
控件的设置调用方法:
//设置GroupDialog大小 public GroupDialog setAlertDialogSize(double size) { mainViewGroup.setLayoutParams(new LinearLayout.LayoutParams((int) (display.getWidth() * size), LayoutParams.WRAP_CONTENT)); return this; } //设置GroupDialog的Style public GroupDialog setAlertDialogStyle(int style) { dialog = new Dialog(context, style); // dialog.setContentView(view); Window dialogWindow = dialog.getWindow(); dialogWindow.setGravity(Gravity.CENTER | Gravity.BOTTOM); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); lp.x = 0; lp.y = 0; dialogWindow.setAttributes(lp); return this; } //设置标题 public GroupDialog setTitle(String title) { showTitle = true; if ("".equals(title)) { titleTextView.setText("标题"); } else { titleTextView.setText(title); } return this; } public GroupDialog setIcon(int resId, String title) { showIcon = true; iconImageView.setImageResource(resId); titleTextView.setText(title); return this; } //设置内容 public GroupDialog setMsg(String msg) { showMsg = true; if ("".equals(msg)) { msgTextView.setText("内容"); } else { msgTextView.setText(msg); } return this; } //设置选择面板 public GroupDialog setSelsctPanel(int lefticon, int righticon, String leftcontext, String rightcontext) { showSelsetPanel = true; if ("".equals(leftcontext)) { leftTextView.setVisibility(View.GONE); } else { leftTextView.setText(leftcontext); leftTextView.setVisibility(View.VISIBLE); } if ("".equals(rightcontext)) { rightTextView.setVisibility(View.GONE); } else { rightTextView.setText(rightcontext); rightTextView.setVisibility(View.VISIBLE); } if ("".equals(lefticon) || lefticon == 0) { lefticonImageView.setVisibility(View.GONE); } else { lefticonImageView.setBackgroundResource(lefticon); lefticonImageView.setVisibility(View.VISIBLE); } if ("".equals(righticon) || righticon == 0) { righticonImageView.setVisibility(View.GONE); } else { righticonImageView.setBackgroundResource(righticon); righticonImageView.setVisibility(View.VISIBLE); } return this; } //设置左面板监听 public GroupDialog setLeftPanelOnClick(final OnClickListener leftlistener) { setLeftOnClik = true; leftpanelViewGroup.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { leftlistener.onClick(v); dismiss(); } }); return this; } //设置右面监听 public GroupDialog setRightPanelOnClick(final OnClickListener rightlistener) { setRightOnClik = true; rightpanelViewGroup.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { rightlistener.onClick(v); dismiss(); } }); return this; } //设置取消 public void setCancleable(boolean cancle) { dialog.setCancelable(cancle); } //设置触摸外界不销毁 public GroupDialog setCancleOnTouchOutside(boolean cancle) { dialog.setCanceledOnTouchOutside(cancle); return this; } //增加List的Item public GroupDialog addListItems(String strItem, ListItemsColor color, final OnListItemsClickListener listener) { showList = true; if (listListItems == null) { listListItems = new ArrayList<ListItems>(); } listListItems.add(new ListItems(strItem, color, listener)); return this; } //设置取消按键的监听 public GroupDialog setCanaleBtnClickListener(String text, final OnClickListener listener) { showCanclebtn = true; if ("".equals(text)) { cancleButton.setText("取消"); } else { cancleButton.setText(text); } cancleButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { listener.onClick(v); dismiss(); } }); return this; } //设置List private void setListItems() { if (listListItems == null || listListItems.size() <= 0) { return; } int size = listListItems.size(); if (size > 7) { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mainScrollView.getLayoutParams(); params.height = display.getHeight() / 2; mainScrollView.setLayoutParams(params); } for (int i = 1; i <= size; i++) { final int index = i; ListItems listItems = listListItems.get(i - 1); String strItem = listItems.itemname; ListItemsColor color = listItems.itemscolor; final OnListItemsClickListener listener = listItems.onListItemsClickListener; TextView textView = new TextView(context); textView.setText(strItem); textView.setTextSize(18); textView.setGravity(Gravity.CENTER); //Item背景图片 if (size == 1) {//首条目 if (showTitle) { textView.setBackgroundResource(R.drawable.selector_bottom_btn); } else { textView.setBackgroundResource(R.drawable.selector_single_btn); } } else { if (showTitle) { if (i >= 1 && i < size) {//中间条目 textView.setBackgroundResource(R.drawable.selector_middle_btn); } else { textView.setBackgroundResource(R.drawable.selector_bottom_btn); } } else { if (i == 1) {//底部条目 textView.setBackgroundResource(R.drawable.selector_top_btn); } else if (i < size) { textView.setBackgroundResource(R.drawable.selector_middle_btn); } else { textView.setBackgroundResource(R.drawable.selector_bottom_btn); } } } // 字体颜色 if (color == null) { textView.setTextColor(Color.parseColor(ListItemsColor.Blue .getName())); } else { textView.setTextColor(Color.parseColor(color.getName())); } // 高度 float scale = context.getResources().getDisplayMetrics().density; int height = (int) (45 * scale + 0.5f); textView.setLayoutParams(new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, height)); // 点击事件 textView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { listener.onClick(index); dismiss(); } }); listViewGroup.addView(textView); } } //设置PositiveButton public GroupDialog setPositiveButton(String text, final OnClickListener listener) { showPosBtn = true; if ("".equals(text)) { posButton.setText("确定"); } else { posButton.setText(text); } posButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { listener.onClick(v); if (posButton.getText().equals("取消")) { dismiss(); } } }); return this; } //设置NegativeButton public GroupDialog setNegativeButton(final String text, final OnClickListener listener) { showNegBtn = true; if ("".equals(text)) { negButton.setText("取消"); } else { negButton.setText(text); } negButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { listener.onClick(v); if (negButton.getText().equals("取消")) { dismiss(); } if (negButton.getText().equals("详情")) { negButton.setText("收起"); if (showProgressBarHor) { msgTextView.setVisibility(View.VISIBLE); lineView.setVisibility(View.VISIBLE); } } else if (negButton.getText().equals("收起")) { negButton.setText("详情"); msgTextView.setVisibility(View.GONE); lineView.setVisibility(View.GONE); } else { dismiss(); } } }); return this; } //设置计时器 public GroupDialog setCountDown(int time, String msg, final OnTimeAlertViewClickListener positiveListener) { showCountDown = true; timeCount = time; timeMessgae = msg; if ("".equals(msg)) { msgTextView.setText("内容"); } else { msgTextView.setText(timeCount + timeMessgae); } handler.sendEmptyMessage(0); msgTextView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (null != positiveListener) { positiveListener.confirm(); } dismiss(); } }); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { handler.removeMessages(0); positiveListener.confirm(); } }); handler.sendEmptyMessage(-1); return this; } //调用时间接口 public interface OnTimeAlertViewClickListener { public abstract void confirm(); } public interface DialogItemClickListener { public abstract void confirm(String result); } //水平进度条 public GroupDialog setProgressBarHor(final int allsum) { showProgressBarHor = true; progressBarHor.setMax(allsum); progressBarHor.setIndeterminate(false);//设置显示明确的进度,true为不显示 progressBarHor.getProgress(); progress = progressBarHor.getProgress(); timeCount = allsum; handler.sendEmptyMessage(1); return this; } //圆形进度条 public GroupDialog setProgressBarRound(final int allsum) { showProgressBarRound = true; progressBarRound.setMax(allsum); progressBarRound.setIndeterminate(false);//设置显示明确的进度,true为不显示 progressBarRound.getProgress(); progress = progressBarRound.getProgress(); timeCount = allsum; handler.sendEmptyMessage(1); return this; } //日期Dialog public GroupDialog dateDialog() { Calendar c = Calendar.getInstance(); DatePickerDialog dialog = new DatePickerDialog(context, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker dp, int year, int month, int dayOfMonth) { showToast(year + "-" + (month + 1) + "-" + dayOfMonth); } }, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)); dialog.show(); return this; } //时间Dialog public GroupDialog timeDialog() { Calendar c = Calendar.getInstance(); new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker arg0, int hourOfDay, int minute) { showToast(hourOfDay + ":" + minute); } }, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true) .show(); return this; }
控件隐现:
private void setLayout() { //默认标题样式 if (!showTitle && !showMsg && !showSelsetPanel && !showList && !showIcon) { titleTextView.setText("提示"); titleTextView.setVisibility(View.VISIBLE); titleViewGroup.setVisibility(View.VISIBLE); } if (showTitle) { titleTextView.setVisibility(View.VISIBLE); titleViewGroup.setVisibility(View.VISIBLE); } if (showIcon) { iconImageView.setVisibility(View.VISIBLE); titleTextView.setVisibility(View.VISIBLE); titleViewGroup.setVisibility(View.VISIBLE); } if (showMsg) { msgTextView.setVisibility(View.VISIBLE); } if (!showPosBtn && !showNegBtn && !showSelsetPanel && !showList) { posButton.setText("确定"); posButton.setVisibility(View.VISIBLE); functionViewGroup.setVisibility(View.VISIBLE); posButton.setBackgroundResource(R.drawable.alertdialog_single_selector); posButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); } if (showPosBtn && showNegBtn && !showList) { posButton.setVisibility(View.VISIBLE); posButton.setBackgroundResource(R.drawable.alertdialog_right_selector); negButton.setVisibility(View.VISIBLE); negButton.setBackgroundResource(R.drawable.alertdialog_left_selector); lineIamgeView.setVisibility(View.VISIBLE); middleLineImsageView.setVisibility(View.VISIBLE); } if (showPosBtn && !showNegBtn && !showSelsetPanel && !showList) { posButton.setVisibility(View.VISIBLE); functionViewGroup.setVisibility(View.VISIBLE); posButton.setBackgroundResource(R.drawable.alertdialog_single_selector); middleLineImsageView.setVisibility(View.GONE); lineIamgeView.setVisibility(View.VISIBLE); if (!showMsg || !showProgressBarRound || !showProgressBarHor) { lineView.setVisibility(View.GONE); } else { lineView.setVisibility(View.VISIBLE); } } if (!showPosBtn && showNegBtn && !showSelsetPanel && !showList) { negButton.setVisibility(View.VISIBLE); functionViewGroup.setVisibility(View.VISIBLE); negButton.setBackgroundResource(R.drawable.alertdialog_single_selector); middleLineImsageView.setVisibility(View.GONE); lineIamgeView.setVisibility(View.VISIBLE); if (!showMsg || !showProgressBarRound || !showProgressBarHor) { lineView.setVisibility(View.GONE); } else { lineView.setVisibility(View.VISIBLE); } } if (showSelsetPanel) { posButton.setVisibility(View.GONE); negButton.setVisibility(View.GONE); functionViewGroup.setVisibility(View.GONE); selectpanelViewGroup.setVisibility(View.VISIBLE); leftpanelViewGroup.setVisibility(View.VISIBLE); rightpanelViewGroup.setVisibility(View.VISIBLE); } if (showList) { posButton.setVisibility(View.GONE); negButton.setVisibility(View.GONE); functionViewGroup.setVisibility(View.GONE); listViewGroup.setVisibility(View.VISIBLE); setListItems(); } if (showCountDown) { msgTextView.setVisibility(View.VISIBLE); } if (showCanclebtn) { cancleButton.setVisibility(View.VISIBLE); } if (showProgressBarHor) { if (showMsg) { lineView.setVisibility(View.VISIBLE); } progressBarHor.setVisibility(View.VISIBLE); } if (showProgressBarRound) { if (showMsg) { lineView.setVisibility(View.VISIBLE); } progressBarRound.setVisibility(View.VISIBLE); } dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { dismiss(); } }); }
最后是该项目调用这个GroupDialog的代码演示:
<span style="font-size:14px;"> public void onClick(View v) { switch (v.getId()) { case R.id.activity_setting_textview_updata: new GroupDialog(this).builder(R.style.AlertDialogStyle).setTitle("温馨提示").setMsg("发现新版本,建议立即更新使用").setPositiveButton("立即更新", new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "正在下载更新…", Toast.LENGTH_SHORT).show(); } }).setNegativeButton("下次再说", new OnClickListener() { @Override public void onClick(View v) { } }).show(); break; case R.id.activity_setting_textview_loginout: new GroupDialog(this).builder(R.style.AlertDialogStyle).setMsg("是否退出登录?").setPositiveButton("确定", new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "退出登录", Toast.LENGTH_SHORT).show(); } }).setNegativeButton("取消", new OnClickListener() { @Override public void onClick(View v) { } }).show(); break; case R.id.activity_setting_textview_select_panel: new GroupDialog(this).builder(R.style.AlertDialogStyle).setAlertDialogSize(0.9).setSelsctPanel(R.mipmap.ic_launcher, R.mipmap.ic_launcher, "左面板", "右面板").setLeftPanelOnClick(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "左面板", Toast.LENGTH_SHORT).show(); } }).setRightPanelOnClick(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "右面板", Toast.LENGTH_SHORT).show(); } }).show(); break; case R.id.activity_setting_textview_list: //这里的setAlertDialogSize(0.95),不要设置为1否知因外面的布局导致弹出的AlertDialogde 右边出错没有了圆角的背景,原因估计跟andoird画图有些关系吧,具体不明。 new GroupDialog(this).builder(R.style.ActionListDialogStyle).setAlertDialogSize(0.95).setTitle("选择操作").setCancleOnTouchOutside(false).addListItems("条目一", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("条目二", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("条目三", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("条目四", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("条目五", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("条目六", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("条目七", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("条目八", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("条目九", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("条目十", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).setCanaleBtnClickListener("取消", new OnClickListener() { @Override public void onClick(View v) { } }).show(); break; case R.id.activity_setting_textview_towbtn: new GroupDialog(this).builder(R.style.AlertDialogStyle).setAlertDialogSize(0.5).addListItems("复制", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "复制" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("删除", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "删除" + which, Toast.LENGTH_SHORT).show(); } }).show(); break; case R.id.activity_setting_textview_countdown: new GroupDialog(this).builder(R.style.AlertDialogStyle).setAlertDialogSize(0.8).setTitle("倒数面板").setCountDown(5, "秒后自动跳转页面", new OnTimeAlertViewClickListener() { @Override public void confirm() { Toast.makeText(getApplicationContext(), "删除成功", Toast.LENGTH_SHORT).show(); } }).setPositiveButton("手动跳转", new OnClickListener() { @Override public void onClick(View v) { GroupDialog.dismiss(); Toast.makeText(getApplicationContext(), "跳转成功!", Toast.LENGTH_SHORT).show(); } }).setCancleOnTouchOutside(false).show(); break; case R.id.activity_setting_textview_bottom: new GroupDialog(this).builder(R.style.ActionListDialogStyle).setAlertDialogSize(0.95).setCancleOnTouchOutside(false).addListItems("条目一", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).addListItems("条目二", ListItemsColor.Blue, new OnListItemsClickListener() { @Override public void onClick(int which) { Toast.makeText(getApplicationContext(), "item" + which, Toast.LENGTH_SHORT).show(); } }).setCanaleBtnClickListener("取消", new OnClickListener() { @Override public void onClick(View v) { } }).show(); break; case R.id.activity_setting_textview_progressbarhor: new GroupDialog(this).builder(R.style.AlertDialogStyle).setAlertDialogSize(0.7).setTitle("正在更新中").setProgressBarHor(100).setPositiveButton("取消", new OnClickListener() { @Override public void onClick(View v) { } }).setCancleOnTouchOutside(true).show(); break; case R.id.activity_setting_textview_updataprogressbarhor: new GroupDialog(this).builder(R.style.AlertDialogStyle).setAlertDialogSize(0.85).setTitle("正在更新中").setProgressBarHor(100).setNegativeButton("详情", new OnClickListener() { @Override public void onClick(View v) { GroupDialog.showUpodataMessage("1、新增自定义水平进度条Dialog。\n" + "2、新增自定义环形进度条Dialog。\n" + "3、新增选择日期Dialog。\n" + "4、新增选择时间Dialog。\n" + "5、新增标题带有图标的Dialog。\n" + "6、优化进度条倒计时使用到的线程。"); } }).setPositiveButton("取消", new OnClickListener() { @Override public void onClick(View v) { } }).setCancleOnTouchOutside(true).show(); break; case R.id.activity_setting_textview_waitting_progressbarround: new GroupDialog(this).builder(R.style.AlertDialogStyle).setAlertDialogSize(0.5).setTitle("等待中……").setProgressBarRound(100).setNegativeButton("取消", new OnClickListener() { @Override public void onClick(View v) { } }).setCancleOnTouchOutside(true).show(); break; case R.id.activity_setting_textview_data: new GroupDialog(this).dateDialog(); break; case R.id.activity_setting_textview_time: new GroupDialog(this).timeDialog(); break; case R.id.activity_setting_textview_icon: new GroupDialog(this).builder(R.style.AlertDialogStyle).setAlertDialogSize(0.8).setIcon(R.mipmap.ic_launcher, "这是一个带有图标的Dialog").setNegativeButton("确定", new OnClickListener() { @Override public void onClick(View v) { } }).show(); break; }</span>
以上就是该项目的全部实现过程,如有不明或是指出错误地方的朋友也欢迎留言交流。
项目下载
相关文章推荐
- iOS --typedef enum的用法
- ios7导航栏返回按钮的一些问题总结
- IOS开发把一个结构体放到数组中
- iOS开发视图控制器(ViewController)调用[super viewXXX]的简单理解
- iOS与JS交互实战篇(ObjC版)
- IOS学习 使用OCMock单元测试(一)安装
- ios 开发过程中遇到的一些需要注意的地方
- 浅析iOS中实例方法和类方法
- iOS开发 CocoaPods 的安装流程
- 分析iOS Crash文件:符号化iOS Crash文件的3种方法
- iOS取整
- iOS开发资源:VideoPlayerKit、AHAlertView以及REMenu等
- smartsvn解决冲突的方法
- iOS NSURLSession后台下载和断点续传
- 用HTML5/CSS3/JS开发Android/IOS应用框架大全
- IOS中正则表达式的使用
- iOS 单例的滥用和用依赖注入替代
- ios开发技巧之tableView去掉多余的空行分割线 自定义cell分割线
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
- IOS长按事件的方法