屏幕亮度怎么总自动黑自动亮怎么黑不了

监听手势事件
实现处理事件
添加未实现的方法
重写onTouch事件
交由手势探测接口处理触摸事件
1、在xml中定义ViewFlipper控件;
2、重写onTouchEvent方法,用于捕获Touch事件
3、写push_left_in.xml、push_left_out.xml、push_right_in.xml、push_right_out.xml文件,用于滑动时的效果显现;
4、在Activity中定义OnGestureListener,重写onFling方法,根据e1、e2的坐标差判断左右滑动,同时在里面写滑动的效果。
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e1.getX() - e2.getX() & 120) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
this.flipper.showNext();
return true;
} else if (e1.getX() - e2.getX() & -120) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
this.flipper.showPrevious();
return true;
return false;
工程下载:
1、加入android-support-v4.jar,关于android-support-v4.jar的详细信息,大家可以访问google官方网站:;
2、XML中,用FrameLayout完成布局,放入ViewPager和指引图标
&?xml version="1.0" encoding="utf-8"?&
&FrameLayout xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" &
&LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" &
&include layout="@layout/item_header" /&
&android.support.v4.view.ViewPager
android:id="@+id/guidePages"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /&
&/LinearLayout&
&!-- 指引图标 --&
&LinearLayout
android:id="@+id/viewGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginBottom="40dp"
android:gravity="center_horizontal"
android:orientation="horizontal" &
&/LinearLayout&
&/FrameLayout&
3、将页面布局加入View的列表中,有几个布局页面就有几个圆点图片,通过for循环设置圆点图片的布局;
//添加到View的List中
LayoutInflater inflater = getLayoutInflater();
pageViews = new ArrayList&View&();
pageViews.add(inflater.inflate(R.layout.item05, null));
pageViews.add(inflater.inflate(R.layout.item06, null));
pageViews.add(inflater.inflate(R.layout.item01, null));
pageViews.add(inflater.inflate(R.layout.item02, null));
pageViews.add(inflater.inflate(R.layout.item03, null));
pageViews.add(inflater.inflate(R.layout.item04, null));
// 有几个布局页面就有几个圆点图片
imageViews = new ImageView[pageViews.size()];
// 通过for循环设置圆点图片的布局
for (int i = 0; i & pageViews.size(); i++) {
imageView = new ImageView(GuideViewTestActivity.this);
imageView.setLayoutParams(new LayoutParams(20, 20));
imageView.setPadding(20, 0, 20, 0);
imageViews[i] = imageV
if (i == 0) {
  // 默认选中第一张图片
  imageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);
  imageViews[i].setBackgroundResource(R.drawable.page_indicator);
group.addView(imageViews[i]);
4、数据适配器和页面切换事件监听器
5、在指引页面更改事件监听器(GuidePageChangeListener)中要确保在切换页面时下面的圆点图片也跟着改变
public void onPageSelected(int arg0) {
for (int i = 0; i & imageViews. i++) {
imageViews[arg0].setBackgroundResource(R.drawable.page_indicator_focused);
if (arg0 != i) {
imageViews[i].setBackgroundResource(R.drawable.page_indicator);
工程下载:
1、XML中,定义ViewFlipper控件,在里面加入多个页面布局,也可以用代码ViewFlipper的addView方法;
2、写push_left_in.xml、push_left_out.xml、push_right_in.xml、push_right_out.xml文件;
3、加入权限
&uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /&
4、在Activity中,初始化左右悬浮按钮,创建左右按钮,并设置监听事件(替换图片);
* 初始化悬浮按钮
private void initImageButtonView() {
// 获取WindowManager
wm = (WindowManager) getApplicationContext().getSystemService("window");
// 设置LayoutParams相关参数
wmParams = new WindowManager.LayoutParams();
// 设置window type
wmParams.type = LayoutParams.TYPE_PHONE;
// 设置图片格式,效果为背景透明
wmParams.format = PixelFormat.RGBA_8888;
// 设置Window flag参数
wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
// 设置x、y初始值
wmParams.x = 0;
wmParams.y = 0;
// 设置窗口长宽数据
wmParams.width = 50;
wmParams.height = 50;
// 创建左右按钮
createLeftButtonView();
createRightButtonView();
5、重写onTouchEvent事件,用于触发显示和隐藏悬浮按钮事件(MotionEvent.ACTION_DOWN和MotionEvent.ACTION_UP);
6、利用线程,控制悬浮按钮的透明度(Alpha和invalidate)
工程下载:
阅读(...) 评论()主题 : iOS7导航栏左侧按钮自定义影响系统返回手势问题
级别: 新手上路
可可豆: 88 CB
威望: 85 点
在线时间: 212(时)
发自: Web Page
iOS7导航栏左侧按钮自定义影响系统返回手势问题&&&
如题,大家知道新功能有个返回手势动作,但是当此界面自定义的导航栏的左侧按钮(右侧没事)就会出现手势实效的问题,在网上查了很久,发现大家基本都是那一两种答案!其一,设置代理,并在对应界面控制响应功能,此方法倒是可以实现返回手势,但是有Bug,主界面要是也去用返回手势操作下就会出现界面错乱,按照网上解决未果,感觉大家没有自己亲自尝试就转载了!其二,使用新特性appearance代替leftBarButtonItem设置左按钮,这样设置完的效果我是无法接受,你们可以试试,有完美的让我看看啊!目前没有找到更好的办法,你们知道吗?请指点一二!
级别: 新手上路
UID: 262318
可可豆: 33 CB
威望: 20 点
在线时间: 18(时)
发自: Web Page
UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeCustom];
& [leftButton setSize:CGSizeMake(40, 30)];
& [leftButton setBackgroundImage:[UIImage imageNamed:NI_USER_BACK_ICON] forState:UIControlStateNormal];
& [leftButton addTarget:self action:@selector(back_click:) forControlEvents:UIControlEventTouchUpInside];
& UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:leftButton];
& self.navigationItem.leftBarButtonItem = leftI &
&这样设置有问题么
级别: 新手上路
可可豆: 88 CB
威望: 85 点
在线时间: 212(时)
发自: Web Page
你这样设置在新系统中会出现问题!只要使用self.navigationItem.leftBarButtonItem就会把这返回手势屏蔽,你的程序就不能响应返回手势了!
级别: 新手上路
可可豆: 88 CB
威望: 85 点
在线时间: 212(时)
发自: Web Page
目前已经解决!方案:在RootViewController的viewDidAppear中把self.navigationController.interactivePopGestureRecognizer.enabled = NO;并且在推出ChildViewController前调用if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
self.navigationController.interactivePopGestureRecognizer.delegate =
}即可实现自定义与返回手势不冲突且无BUG!
级别: 新手上路
可可豆: 88 CB
威望: 85 点
在线时间: 212(时)
发自: Web Page
你写错位置了!是在A中的pushB这句话之前写self.navigationController.interactivePopGestureRecognizer.enabled = YES; self.navigationController.interactivePopGestureRecognizer.delegate = 这两句!我试过,不会有错!
级别: 新手上路
可可豆: 88 CB
威望: 85 点
在线时间: 212(时)
发自: Web Page
额 这个问题问的太好了 那就不要用storyboard拖线,我就不用
级别: 新手上路
可可豆: 88 CB
威望: 85 点
在线时间: 212(时)
发自: Web Page
额 这个问题问的太好了 那就不要用storyboard拖线,我就不用
级别: 新手上路
UID: 301231
可可豆: 2 CB
威望: 1 点
在线时间: 13(时)
发自: Web Page
如果有三级视图就会发现这种办法都不行的,不信可以自己写个demo去试试。
级别: 新手上路
可可豆: 88 CB
威望: 85 点
在线时间: 212(时)
发自: Web Page
我试过了 没有问题的!
级别: 新手上路
可可豆: 88 CB
威望: 85 点
在线时间: 212(时)
发自: Web Page
我试过,没有问题的!
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
发布时间: 11:48:00
编辑:www.fx114.net
本篇文章主要介绍了"iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案",主要涉及到iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案方面的内容,对于iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案感兴趣的同学可以参考一下。
今天遇到了在iOS7上使用leftBarButtonItem却无法响应滑动返回事件的问题,一番谷歌,最后终于解决了,在这里把解决方案分享给大家。
在iOS7之前的系统,如果要自定义返回按钮,直接设置backBarButtonItem是不行的,有两种方式,一种是用leftBarButtonItem替代;一种是:
UIImage *backButtonImage = [[UIImage imageNamed:@&Graphics/Shared/navigation_back_button.png&] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage
forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
但第二种方法只能自定义返回按钮的背景和文字,如果要自定义上面的图标则不行。所以使用leftBarButtonItem是最佳方式。
但是在iOS7系统中,自带了可以通过右滑返回上一级页面的手势,如果仅仅修改leftBarButtonItem是无法响应这个手势的。可以在pushViewController之后加入如下代码:
[_currentNav pushViewController:viewController animated:YES];
//开启iOS7的滑动返回效果
if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
_currentNav.interactivePopGestureRecognizer.delegate =
这样即可完美解决iOS7上无法滑动的问题。
当然网上还有一种解决方法是在设置leftBarButtonItem之后加上:
self.navigationItem.backBarButtonItem = backB
self.navigationController.interactivePopGestureRecognizer.delegate =
但这两行代码必须放在viewWillAppear中,相比上一种方式要修改的代码更多,因此建议使用上一种方式。
响应了iOS7的滑动返回手势之后,我们还会发现一个问题,iOS7的滑动返回不会调用我们给leftBarButtonItem设置的回调,那么返回的事件如何捕捉呢?可以通过以下代码:
- (void)viewWillDisappear: (BOOL)animated
[super viewWillDisappear: animated];
if (![[self.navigationController viewControllers] containsObject: self])
// the view has been removed from the navigation stack, back is probably the cause
// this will be slow with a large stack however.
至此,我们就完美解决了iOS7上使用leftBarButtonItem的滑动返回问题。
有朋友提出以上方式在多次滑动之后会导致界面假死,这里再给出一种解决方案:
在所有除一级页面之外的页面的viewDidAppear和viewWillDisappear中加入以下代码:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
//代理置空,否则会闪退
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.delegate =
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
//开启iOS7的滑动返回效果
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
//只有在二级页面生效
if ([self.navigationController.viewControllers count] == 2) {
self.navigationController.interactivePopGestureRecognizer.delegate =
在uinavigationcontroller的delegate中实现以下方法:
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
//开启滑动手势
if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
navigationController.interactivePopGestureRecognizer.enabled = YES;
在pushviewcontroller之前加入以下代码:
//在切换界面的过程中禁止滑动手势,避免界面卡死
if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
_currentNav.interactivePopGestureRecognizer.enabled = NO;
[_currentNav pushViewController:viewController animated:YES];
即可在实现滑动返回的同时,避免界面卡死的问题。
如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)
个人博客:
本文地址:
转载请注明出处,谢谢!
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:iOS之手势滑动返回功能-b - 介似??? - 博客园
随笔 - 857, 文章 - 0, 评论 - 20, 引用 - 0
iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的,那么你需要自定义UINavigationBar,但当你自定义navigationBar后,这个功能就会自动失效。
屏蔽右滑返回功能代码:
if&([self.navigationController&respondsToSelector:@selector(interactivePopGestureRecognizer)])&{&&&&
&&&&self.navigationController.interactivePopGestureRecognizer.enabled&=&NO;&&&&
开启滑动返回功能代码:
-&(void)viewWillAppear:(BOOL)animated{&&
&&&&[super&viewWillAppear:animated];&&
&&&&if&([self.navigationController&respondsToSelector:@selector(interactivePopGestureRecognizer)])&{&&
&&&&&&&&self.navigationController.interactivePopGestureRecognizer.delegate&=&&&
注意各种坑:
"在一级视图中,iOS样式返回的手势滑动一下,然后进入二级视图,发现画面卡住了,按Home键转入后台,再返回应用,发现并没有Crash掉,而是直接跳到了二级视图里,运行正常了,大家知道push和pop的原理是用进栈出栈完成的,可能因为在一级视图中滑动那一下,影响了视图在栈中的位置。 "
------有人提到通过以下方法处理:&一级视图中一定要加入self.navigationController.interactivePopGestureRecognizer.enabled = NO;,先把iOS7手势返回屏蔽掉,到二级视图再用self.navigationController.interactivePopGestureRecognizer.enabled = YES打开&
自己写了个demo试运行,发现self.navigationController.interactivePopGestureRecognizer.enabled 不能动态设置更改状态。因此该方法不可行。
解决方法:
-&(void)viewDidAppear:(BOOL)animated&&
__weak&typeof(self)&weakSelf&=&&&
&self.navigationController.interactivePopGestureRecognizer.delegate&=&weakS&&
实现手势协议:
#pragma&mark&-&UIGestureRecognizerDelegate&&
-&(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer{&&
&&&&if&(self.navigationController&&&&self.navigationController.viewControllers.count&==&1)&{&&
&&&&&&&&return&NO;&&
&&&&return&YES;&&
但问题又来了,如果是一个显示成功/失败结果页,滑动返回不大符合正常思维,因为需要选择性屏蔽处理。
终极解决方法:自定义全屏滑动手势UIPanGestureRecognizer
#import&"BasicNavigationController.h"&&
#import&"BaseResultViewController.h"&&
@interface&BasicNavigationController()&&UIGestureRecognizerDelegate&&&
@implementation&BasicNavigationController&&
-&(void)viewDidLoad&&
&&&&[super&viewDidLoad];&&
&&&&[self.navigationBar&setTitleTextAttributes:@{NSForegroundColorAttributeName&:&WhiteColor}];&&
&&&&id&target&=&self.interactivePopGestureRecognizer.&&
&&&&UIPanGestureRecognizer&*pan&=&[[UIPanGestureRecognizer&alloc]&initWithTarget:target&action:@selector(handleNavigationTransition:)];&&
&&&&pan.delegate&=&&&
&&&&[self.view&addGestureRecognizer:pan];&&
&&&&self.interactivePopGestureRecognizer.enabled&=&NO;&&
-&(void)pushViewController:(UIViewController&*)viewController&animated:(BOOL)animated&&
&&&&[viewController.navigationItem.backBarButtonItem&setTitleTextAttributes:@{NSFontAttributeName&:&[UIFont&systemFontOfSize:Scale_Size_Smaller()]}&forState:UIControlStateNormal];&&
&&&&if&(self.childViewControllers.count&&&0)&{&&
&&&&&&&&viewController.hidesBottomBarWhenPushed&=&YES;&&
&&&&[super&pushViewController:viewController&animated:YES];&&
-&(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer&*)gestureRecognizer&&
&&&&if&(self.childViewControllers.count&==&1)&{&&
&&&&&&&&return&NO;&&
&&&&UIViewController&*vc&=&[self.childViewControllers&lastObject];&&
&&&&if&([vc&isKindOfClass:[BaseResultViewController&class]])&{&&
&&&&&&&&return&NO;&&
&&&&return&YES;&&
===============================
iOS自定义导航条(页面手势返回时 导航条更随控制器一起滑动)
前段时间被问到一个问题就是一个JD的UI效果如图
IMG_0485.PNG
其实就是一个原生的导航条
一个是自定义的导航条第一想法 肯定是 将原生的navgationBar 隐藏掉
让后搞一个UIview
覆盖到原来的位置,
然后在UIview 的上面分别添加左button
和右button 和中间的titleview
当然这样做汪全是可以的
但是我感觉那么 navgationBar 使用的时候就不够方便了
所以 我们可以单独创建一个NavgationBar 然后添加到视图控制器上
那么首先我们创建一个基类
让其继承与UIviewcontroler
并且项目中的其他项目全部继承与这个基类
#import &UIKit/UIKit.h&
#import "ZJNavgationbar.h"
@interface ZJbaseViewController : UIViewController
@property (nonatomic,strong)UINavigationBar * NavigationB
@property (nonatomic,strong)UINavigationItem *ZJNavigationI
将UINavigationBar定义成基类控制器的公开属性
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if (!self.NavigationBar) {
self.NavigationBar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width,64)];
[self.view addSubview:self.NavigationBar];
self.ZJNavigationItem = [[UINavigationItem alloc]initWithTitle:@"hellows"];
[self.NavigationBar pushNavigationItem:self.ZJNavigationItem animated:YES];
UIBarButtonItem * logeItem = [[UIBarButtonItem alloc]initWithTitle:@"登录" style:UIBarButtonItemStylePlain target:self action:@selector(logeClick)];
NSArray * arr = @[logeItem];
self.ZJNavigationItem.rightBarButtonItems =
if ([self.navigationController.childViewControllers count]&1) {
UIBarButtonItem * backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(backclick)];
NSArray * arrleft = @[backItem];
self.ZJNavigationItem.leftBarButtonItems =
在控制器的 viewWillAppear 中判断是否存在 NavgationBar 存在的话就不创建 然则反之.并且把 navgationbar 添加在 控制器的self.view 上那么 说有集成于基类的控制器
都会拥有这个导航栏
2.导航栏添加名称首先分析
原生的导航栏添加标题
self.navigationItem.title = @"名称";
我们可以看出来 标题时添加在navgationitem 上 而且 navgationitem 是控制器的属性 而且是只读的 这时候在通过这个属性赋值的话 就会失效
那么为了方便 我们应该同事也自定义一个UINavigationItem同时也将 属性暴漏出来
如上述代码这时候呢 那么
添加左右button
也就可以和原来一样
而且可以实现上图的效果.但是还有一点问题就是 如果控制器是带xib 文件的话
那么导航栏的宽度会比控制器款
F9B1A4A9-0D36-455A-88F0-D29EF472AAB5.png
正常的控制器效果是这样的
6495EAEE-55FD-47AB-B5C7-A29CE41795BF.png
大概原因因该是我现在了 viewwillapper 中的缘故有啥好的解决办法
可以告诉我哦
以后还会更加深入的解析
感觉好像忘了点啥
那就是 让界面允许全屏滑动返回很简单只要一句代码搞定在基类的viewvillappear中添加这一句话 这是kvc 的方法
[self.navigationController.interactivePopGestureRecognizer setValue:@([UIScreen mainScreen].bounds.size.width) forKeyPath:@"_recognizer._settings._edgeSettings._edgeRegionSize"];
好吧 我不会传动态图
今天看了一下昨天遗留下的问题 就是在xib 继承基类是 导航条宽度比屏幕要宽,现在解决的就是在创建 navgationBar 是frame的宽 不能写 self.view.bounds,size.width应该写成
self.NavigationBar = [[UINavigationBar alloc]initWithFrame:CGRectMake(0,0,[UIScreen mainScreen].bounds.size.width,64)];
不上图了 哈哈哈哈这些问题都解决了
还有一个就是
之所以自定义导航栏有一个原因是
不同的iOS系统版本
导航栏格式不同
自定义是为了统一格式. 很显然
我一上的自定义办法不太好
达不到这样的效果啊
========================
系统自带的向右滑动手势返回上一个界面,ios7--手势
当从控制器A push到控制器B,我们返回控制器A,除了使用按钮返回&
[self.navigationController pushViewController:Vc animated:YES];
还可以使用ios7出来的向右滑动,返回控制器A
文档中是这样定义的:
@property(nullable, nonatomic, weak) id&UINavigationControllerDelegate&
@property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
----------------------------------------------------------------------
我们在控制器B中的viewDidLoad中
if ([[[UIDevice currentDevice] systemVersion] floatValue] &= 7.0) {
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
// 手势有效设置为YES
self.navigationController.interactivePopGestureRecognizer.delegate =
// 手势的代理设置为self
但是当回到控制器A中时,再想push到控制器B,就会出现卡屏,不会动的现象,因为rootView也会有向右滑动返回的问题
要解决这个问题,我们只需在控制器A的viewDidAppear中设置,interactivePopGestureRecognizer为NO:
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if ([[[UIDevice currentDevice] systemVersion] floatValue] &= 7.0) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
这样即可以保证再B中向右滑返回A动后再次pushB时不会卡在A界面。浅谈iOS右滑pop功能的实现 - 简书
浅谈iOS右滑pop功能的实现
侧滑返回的效果
从iOS7开始,系统为UINavigationController添加 interactivePopGestureRecognizer属性,这个属性就是系统提供的右滑返回动画,我们可以通过滑动左边边缘实现pop效果。我们可以通过,如上图所示。
self.navigationController.interactivePopGestureRecognizer.enabled = NO关闭系统默认的边缘返回动画。
只能实现边缘拖动,如果从视图除左边边缘以外的部分没有效果。
如果push到其他界面,如果重写的leftBarButtonItem就失效了。
如果解决上面两个问题,我们需要重新实现动画效果。系统只提供了边缘手势,而没有提供在任何地方都可以右滑返回的动画,所以这个需要我们自己创建一个UIPanGestureRecognizer手势。文章后面会具体讲解如何实现。那么,还有一个问题,也就是如果重写的leftBarButtonItem系统的边缘手势就失效了,这个该如何解决呢?其实也非常简单,我们只需要在重写leftBarButtonItem的界面加上下面的代码即可:
self.navigationController.interactivePopGestureRecognizer.delegate =
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
//导航的rootViewController关闭右滑返回功能
if (self.navigationController.viewControllers.count &= 1)
return NO;
return YES;
上面代码可以看出:重新设置了interactivePopGestureRecognizer对象的代理,interactivePopGestureRecognizer 其实也是UIGestureRecognizer的一个子类,然后重写gestureRecognizerShouldBegin:方法,判断导航的根控制器不需要侧滑返回的功能。
self.navigationItem.leftBarButtonItem = customLeftBarButtonI //右滑返回失效
self.navigationItem.backBarButtonItem = customLeftBarButtonI //不影响右滑返回
那么,如果实现一个自定义右滑返回呢?代码很简单。1.自定义一个所有控制器的父类,比如DLBaseViewController,然后在DLBaseViewController的viewDidLoad方法添加下面代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//1.获取系统interactivePopGestureRecognizer对象的target对象
id target = self.navigationController.interactivePopGestureRecognizer.
//2.创建滑动手势,taregt设置interactivePopGestureRecognizer的target,所以当界面滑动的时候就会自动调用target的action方法。
//handleNavigationTransition是私有类_UINavigationInteractiveTransition的方法,系统主要在这个方法里面实现动画的。
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] init];
[pan addTarget:target action:NSSelectorFromString(@"handleNavigationTransition:")];
//3.设置代理
pan.delegate =
//4.添加到导航控制器的视图上
[self.navigationController.view addGestureRecognizer:pan];
//5.禁用系统的滑动手势
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
#pragma mark - 滑动开始会触发
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
//只有导航的根控制器不需要右滑的返回的功能。
if (self.navigationController.viewControllers.count &= 1)
return NO;
return YES;
下面我们的所有的类都继承DLBaseViewController即可。滑动界面的任何地方都可以右滑返回。运行效果图如下。
2.如果有TabbarController,上面的方法还可以用吗?我们创建一个TabbarController的工程,然后测试结果如下:
基于TabbarController
注意: 上面进入第2页隐藏tabbar,是在storyboard选中TwoViewController,勾上Hide Bottom Bar on Push如下图所示:
进入第2页隐藏tabbar
3.一行代码搞定右滑返回功能。上面我们把功能代码写到了父类里面,这样的坏处就是必须每个控制器都要继承同一个父类,所以比较麻烦。而且上面的代码每个控制器都需要执行一次,所以效率比较低。基于上面的缺点,然后用runtime的method swizzling强大技术封装了一个更简单的方法,一行代码就搞定了。
开启右滑返回手势
1.一定要在appDelegate里面开启,并且在UINavigationController初始化之前,否则没有效果。
2.如果用的storyboard,直接在appDelegate类didFinishLaunchingWithOptions开启即可
[DLNavigationTransition enableNavigationTransitionWithPanGestureBack];
注意:由于通过runtime在UINavigationController的viewDidLoad里面添加了手势代码,所以一定要在appDelegate里面开启,并且在UINavigationController初始化之前,否则没有效果。如果项目用的是storyboard,直接在appDelegate类的didFinishLaunchingWithOptions开启即可。
iOS开发一枚}

我要回帖

更多关于 屏幕黑一下又亮 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信