如何让Navigationtabbarcontrollerr的动画不是push

  利用iOS提供的4种视图转换类型:
UIViewAnimationTransitionFlipFromLeft
UIViewAnimationTransitionFlipFromRight
UIViewAnimationTransitionCurlUp
UIViewAnimationTransitionCurlDown
1 MainView *nextView=[[MainView alloc] init];
beginAnimations:nil context:NULL];
3 [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
4 [UIView setAnimationDuration:0.75];
5 [self.navigationController pushViewController:nextView animated:NO];
6 //选择动画
7 [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO];
8 [UIView commitAnimations];
9 [nextView release];
  自定义动画:
在frameworks中添加QuartzCore.framework
在.m文件中导入&#import &QuartzCore/QuartzCore.h&
1 CATransition* transition = [CATransition animation];
2 //执行时间长短
3 transition.duration = 0.5;
4 //动画的开始与结束的快慢
5 transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
6 //各种动画效果
7 transition.type = kCATransitionF //kCATransitionMoveIn, kCATransitionPush, kCATransitionReveal, kCATransitionFade
8 //动画方向
9 //transition.subtype = kCATransitionFromT //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom
10 //将动画添加在视图层上
11 [self.navigationController.view.layer addAnimation:transition forKey:nil];
12 [[self navigationController] popViewControllerAnimated:NO];
  实际上CATransition类中还有一个属性是removedOnCompletion,是此动画执行完后会自动remove,默认值为true。
  transition的type可以返回四种类型:
kCATransitionFade  淡出
kCATransitionMoveIn &覆盖原图
kCATransitionPush & & 推出
kCATransitionReveal & 底部显出来
  transition的subtype也可以有四种类型:
kCATransitionFromRight
kCATransitionFromLeft &&(默认值)
kCATransitionFromTop
kCATransitionFromBottom
  还有一种设置动画类型的方法,不用setSubtype,只用setType
  [transition setType:@"suckEffect"];   或者  transition.type =&@"suckEffect";
  这里的suckEffect为效果名,主要效果有:
pageCurl & & &向上翻一页
pageUnCurl &向下翻一页
rippleEffect & 滴水效果
suckEffect & &收缩效果,如一块布被抽走
cube & & & & & &立方体效果
oglFlip & & & & 上下翻转效果
  //@"cube" @"moveIn" @"reveal" @"fade"(default) @"pageCurl" @"pageUnCurl" @"suckEffect" @"rippleEffect" @"oglFlip"
阅读(...) 评论()Navigation(導覽) Controller是一個可用來導覽內容的方式。以下有兩種方式可以將這個控制器建立到應用程式中,一種是使用initWithNibName的方式,另一種則是利用Interface Builder協助載入view的方式。兩種方式事實上都是很常見,但有許多程式設計師,會認為第一種會比較有操控感,少用Interface
Builder可以讓除錯容易,也更容易從程式碼來理解寫了什麼東西。以下的第一種方式,去除了重載initWithNibName的作法,為了和第二種方式來對應。這裡只是展示了,用兩種方式都可以達到同一個目的,在許多的開發教學中,也會常常見到不同的作法。另外,有一種方式是直接使用在新增Project時,就直接選擇Navigation-based Application,到底幫你作了什麼事?下面第二種方式有說明。
一、利用initWithNibName來載入view的方式:
AppDelegate.h
←加入宣告UINavigationController *navigationC
(並不需要用ib來加nav)
AppDelegate.m
←在applicationDidFinishLaunching區域中加入以下的步驟:
1、加入第一個view controller的header file
#import &FirstViewController.h&
2、alloc init這個nav controller
navigationController = [[UINavigationController alloc] init];
3、加入這個nav controller到window的subview中(用addSubview)
[window addSubview:navigationController.view];
4、用第一個view的controller建立一個新的view controller,並用 initWithNibName初始化
FirstViewController *viewController = [[FirstViewController alloc] initWithNibName:@&FirstView& bundle:nil];
5、用nav controller的pushViewController將第一個view顯現(不需要動畫所以animated設為NO)
[navigationController pushViewController:viewController animated:NO];
6、release剛push完的view controller
[viewController release];
7、在dealloc方法中加入nav controller的release宣告
[navigationController release];
FirstViewControler.h
←加入一個- (IBAction)push:(id)
FirstViewController.m
1、加入第二個view controller的header file
#import &SecondViewController.h&
2、實作push按鈕的action
//2-1初始化
SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@&SecondView& bundle:nil];
//2-2用pushViewController加入,動畫也設為YES
[self.navigationController pushViewController:secondViewController animated:YES];
//2-3把這個加入過的view controller給release
[secondViewController release];
3、在viewDidLoad方法中設title(nav controller用的)
self.title = @&First&;
SecondViewController.h
SecondViewController.m
1、在viewDidLoad方法中設title(nav controller用的)
self.title = @&Second&;
二、利用Interface Builder輔助載入view的方式
(註:在建立一個新的project,選擇Navigation-based Application是直接完成以下的1~5步驟)
(和上述的方式不同處是不需要管第一個要載入的root view,只要設定好nav controller和app delegate的關係,以及設定好是root view是那一個view controller就會自動載入了)
1、建立新project選擇Windows-based Application。AppDelegate.h中加入一個新的IBOutlet UINavigationController。
UINavigationController *navigationC
@property (nonatomic, retain) IBOutlet UINavigationController *navigationC
2、在Classes新增一個新的檔案,選擇Cocoa Touch Classes→UIViewController Subclass,並勾選Option With XIB for user interface,假設名稱為FirstViewController,完成後把.xib檔移至Resource資料夾中
3、雙點擊MainWindow.xib打開Interface Builder,從Library中拉一個Navigation Controller到主視窗中(有File's Owner那個),點選Navigation Controller,然後點出Connection Inspector將設定如下圖。(按住ctrl從Connection Inspector直接拉往主視窗中的xxx App Delegate然後放開)
4、點選Navigation Controller下的Root View Controller,點出Attributes和Identity&Inspector設定如下圖。
5、AppDelegate.m加入以下程式碼
@synthesize navigationC
,並在applicationDidFinishLaunching方法中加入
[window addSubview:navigationController.view];
dealloc方法中加入nav controller的release宣告
[navigationController release];
此時第一個view會正確先載入
6、依照2的說明再加一個新的view controller,名稱為SecondViewController
7、再點擊MainWindow.xib打開Interface Builder,加入一個view controller在最下方,依照第4點的方法選用SecondViewController
8、FirstViewControler.h
←加入一個- (IBAction)push:(id)
9、FirstViewController.m
加入第二個view controller的header file
#import &SecondViewController.h&
實作push按鈕的action
SecondViewController *secondViewController = [[SecondViewController alloc] init];
//用pushViewController加入,動畫也設為YES
[self.navigationController pushViewController:secondViewController animated:YES];
//把這個加入過的view controller給release
[secondViewController release];
在viewDidLoad方法中設title(nav controller用的)
self.title = @&First&;
SecondViewController.h
SecondViewController.m
在viewDidLoad方法中設title(nav controller用的)
self.title = @&Second&;
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:301749次
积分:3696
积分:3696
排名:第3081名
原创:56篇
转载:136篇
评论:95条
(1)(2)(1)(2)(4)(1)(2)(1)(2)(4)(5)(7)(5)(2)(1)(1)(7)(3)(1)(13)(15)(5)(8)(11)(3)(6)(2)(1)(1)(3)(1)(1)(1)(2)(7)(6)(1)(7)(1)(1)(1)(2)(4)(2)(4)(15)(1)(2)(2)(1)(1)(1)(8)iOS 问题:在做项目的时候,发现在一个navigationController push到一个页面后,在这个页面有一个UITextview,然后点击这个textview,弹出键盘,随便打几个字,然后点返回,pop回到第一个controller,用instruments检测有内存泄漏。后来,另外写了个例子,直接用storyboard拖了一个navigationcontroller和一个viewController,内容和上面一样,没有代码,用instruments,检测,还是泄漏,,请问这是怎么回事??? -
在做项目的时候,发现在一个navigationController push到一个页面后,在这个页面有一个UITextview,然后点击这个textview,弹出键盘,随便打几个字,然后点返回,pop回到第一个controller,用instruments检测有内存泄漏。后来,另外写了个例子,直接用storyboard拖了一个navigationcontroller和一个viewController,内容和上面一样,没有代码,用instruments,检测,还是泄漏,,请问这是怎么回事???
共有 1 个回答
项目使用 ARC 了吗,没有的话 在第二个页面的 dealloc 方法中 释放掉那个 textview
登录后方可回复
登录后方可回答
耗时 0.0875 秒& &&[self.navigationController
popToViewController:[self.navigationController.viewControllers
objectAtIndex:2]
animated:YES];
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:147250次
积分:2455
积分:2455
排名:第5855名
原创:77篇
转载:15篇
评论:44条
阅读:9996
(1)(1)(1)(1)(3)(2)(2)(1)(1)(1)(9)(5)(1)(4)(2)(2)(3)(4)(5)(3)(4)(4)(8)(22)(2)9606人阅读
1.UINavigationController是用于构建分层应用程序的主要工具,它维护了一个视图控制器栈,任何类型的视图控制器都可以放入.
& 它在管理,以及换入和换出多个内容视图方面,与UITabBarController(标签控制器)类似. 两者间的主要不同在于:&UINavigationController是作为栈来实现,它更适合用于处理分层数据.
&它还有一个作用是用作顶部菜单。
2. 根控制器,子控制器.
&&& 在设计导航控制器时,需要指定用户看到的第一个视图,该视图处在导航栈的最底层,其对应的控制器称为根控制器.所以不要把根控制器理解为导航控制器.根控制器也是导航控制器的一个子控制器.
&&& 在术语上把栈中的除了根控制器其余的控制器称为子控制器.
&&& 一般地,根控制器对应的视图上有各个子控制器视图的入口,回退到根视图然后再切换各个子视图.
&&& 默认地,导航控制器会自动在当前子控制器对应视图的导航栏的右端加一个返回按钮,名称是上一个视图的标题.
3. 导航按钮.
&& 导航按钮类似于网页上的后退按钮,当点击时,当前的视图控制器出栈,栈中的下一个视图成为当前视图.
4. 其它术语:
&&& 扩展图标(accessory icon)称为扩展指示器(disclosure indicator),告知将切换到另一个视图,它以一个灰色箭头表示.
&&& 细节展示按钮(detail disclosure button)不仅是一个图标,它还是一个可单击的控件.
5.静态使用UINavigationController
&& &&iphone开发基础教程&&第9章,新建window-based application,使用IB向mainwindow.xib添加了一个UINavigationController,
6.控制器与其成员间的关系
(1).UINavigationController
&& UINavigationBar *navigationB应该是管理了所有子控制器的navigationItem,显示在窗口顶部;
&& UIToolbar *工具栏,显示在窗口底部;
(2).UINavigationBar管理了一组 UINavigationItem.
&&&& navigationBar.frame.size.height=44;
(4).UITabBar管理了一组 UITabBarItem.
&&&& UITabBarController
&&&& tabBar.frame.size.height=49;
(5).UIViewController提供了基础的view管理模型.
& 主要成员:
& UINavigationItem *navigationI用于展现视图控制,第一次被访问时创建,被添加到一个navigationBar中.
& NSArray *toolbarI一组UIBarButtonItem,被添加到一个toolBar中.
& UITabBarItem *tabBarI被添加到一个tabBar中.
(6).UINavigationItem是一个视图顶部上的导航条
&& 有如下主要成员:
&& UIView* titleView:显示在导航栏中间.有解释说This property is ignored if leftBarButtonItem is not nil.,使用后发现不是这样的.
&& UIBarButtonItem *leftBarButtonItem
&& UIBarButtonItem *rightBarButtonItem
&& 系统的刷新图标,但是它带有边框。
&& self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)];
&& NavigationController导航栏中添加多个UIBarButtonItem
&& /?p=975
(7).UIBarButtonItem封装了一些属性和行为,它被添加到UIToolBar中.
&& 主要成员
&& UIView* customV
7.一些高级控制器
& UIImagePickerController,
& UITableViewController,
8.http://blog.zhaojie.me/2010/12/iphone-composition-resistant-uitabbarcontroller.html
&& 发现UITabBarController不能放入其他的视图内,而只能直接放在Window上(或Window里的UINavigationController里),否则会出现界面向下偏移的情况。对于UITabBarController抗拒组合的情况,深表叹息。
& 并且UITabBarController中的tabBar如何隐藏??
9.在UIViewController中访问导航:
&&& 通常在UIViewController的子类中调用self.navigationController来调用视图的推入和弹出。不能弹出根,
&&& 要改变导航栏的样式或颜色,访问self.navigationController.navigationBar
&&& 要改变上面的左右按钮或标题内容,访问self.navigationItem,它描述导航栏上的控件内容。
10.UINavigationItem:
&&&& UINavigationItem存储导航项属性,包括:左右按钮,标题,标题视图,返回本页的按钮。还有一个prompt,以导航栏上方再显示一行提示,把导航栏位置向下挤。
&&& 参考/smileEvday/archive//2495153.html
&11.定制标题的3种方法:
&&&& self.title=@&标题文字&;self.title=[[[NSBundle mainBundle] infoDictionary] objectForKey:@&CFBundleName&];
&&&&&self.navigationItem.title=@&标题文字&
&&&& self.navigationItem.titleView=
12.在UIViewController中,使用self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.20392f green:0.19607f blue:0.61176f alpha:1.0f];改变导航栏的颜色,它会形成以中间向上下两边的渐变。其它颜色值不确定能否形成这样的效果。
&&&& 使用self.navigationItem.rightBarButtonItem等控制导航栏上面的内容。
13.可以继承出一个UINavigationController的子类 ,重写pushViewController,popViewControllerAnimated方法,
&&&& 比如可以实现点击默认返回按钮时,二次确认是否执行返回操作。
14.presentModalViewController弹出一个UIViewController时,可能需要它有导航栏,以摆放功能按钮。
&&& 只要再包一层UINavigationController即可。
&& &&&& LocalPhotoViewController* viewController=[[LocalPhotoViewController alloc] initWithImageArray:arr currentIndex:0];
&& &&& &UINavigationController* nav=[[UINavigationController alloc] initWithRootViewController:viewController];
&& &&& &[self presentModalViewController:nav animated:YES];
&& &&& &[nav release];
&& &&& &[viewController release];
&& &&&& 取消时使用[self dismissModalViewControllerAnimated:YES];,viewController在内部执行这个也有效。
15.半透明下沿:
&&&&& (1)第一种方法是:换背景,可以使用比标题栏高的背景图片,在UINavigationBar的drawrect中,把它向下延伸一点画出来,可以达到最下边有层半透明的效果。
&&&&&&&&& ios5中有可以直接修改背景图片的属性了。?
&&&& (2)第二种方法是:操作layer,加下阴影
&&&& #import &QuartzCore/CALayer.h&
&&&& CALayer* navLayer = self.navigationController.navigationBar.
&&& navLayer.masksToBounds = NO;
&&& navLayer.shadowColor = [UIColor blackColor].CGC
&& &navLayer.shadowOffset = CGSizeMake(0.0, 5.0);
&& &navLayer.shadowOpacity = 0.25f;
&&& navLayer.shouldRasterize = YES;//加了这句,可能会导致导航栏内容错乱。
16.修改导航bar的高度,使用类别重写)layoutSubviews方法
@implementation UINavigationBar (CustomHeight)
- (void)layoutSubviews {
& [super layoutSubviews];
& CGRect barFrame = self.
& barFrame.size.height =
& self.frame = barF
17.如果在push后立即pop,若使用了animited,则要延0.4秒再pop,否则可能会导航变为了上一层的,而内容还是本层的。如果animited为NO,则可以立即pop。
18.实现pushViewController:animated:的不同页面转换特效
&&&& 首先要不使用pushViewController的默认动画,在调用时将animated设置为NO.
&&&& 使用普通的来CATransition实现转换效果,示例代码如下:
&& &CATransition *animation = [CATransition animation];
&& &[animation setDuration:0.3];
&& &[animation setType: kCATransitionMoveIn];
&& &[animation setSubtype: kCATransitionFromTop];
&& &[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];
& & [self.navigationController pushViewController:m_poseAddIssueViewController animated:NO];
& & [self.navigationController.view.layer addAnimation:animation forKey:nil];
19.popToViewController 跳过前面的controller,实现多级回退。
20.若要使用自定义的UINavigationBar,先实现自定义的UINavigationBar,例如命名为CustomNavigationBar,然后使用类别重写如下方法:
@implementation UINavigationBar (CustomImage)
+ (Class)class
&&& return NSClassFromString(@&CustomNavigationBar&);
- (void) drawRect: (CGRect)rect
然后在CustomNavigationBar的drawRect中要增加判断,使UIImagePickerController等使用系统默认的风格,如下:
- (void)drawRect:(CGRect)rect
&&& if([self.delegate isKindOfClass:[UIImagePickerController class]])
&&&&&& [super drawRect:rect];
&&&& ........
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:239149次
积分:4707
积分:4707
排名:第2083名
原创:243篇
评论:23条
(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(4)(7)(13)(9)(13)(16)(3)(9)(11)(8)(21)(6)(2)(3)(3)(6)(4)(2)(3)(5)(1)(4)(13)(1)(1)(3)(17)(9)(13)(22)}

我要回帖

更多关于 tabbarcontroller 的文章

更多推荐

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

点击添加站长微信