我提出了一个视图控制器presentModalViewController:,现在如何关闭/关闭它?
我有一个带导航栏的导航应用程序,但有一些实例,而不是将视图控制器推入堆栈,我需要以模态方式呈现视图控制器.问题是,当我关闭模态视图控制器时,除了导航栏被隐藏并且(父视图)已经调整大小之外,一切都按预期运行,这是根据文档的预期行为.所以我想我可以简单地调用内置方法取消隐藏导航栏.我已经尝试过了
[self.navigationController setNavigationBarHidden:NO];
Run Code Online (Sandbox Code Playgroud)
以及没有成功的动画版本.
文档在方法中讨论了这一点
presentModalViewController: animated:
Run Code Online (Sandbox Code Playgroud)
在讨论部分,它说,
在iPhone和iPod touch设备上,modalViewController的视图始终全屏显示"和"将modalViewController属性设置为指定的视图控制器.调整其视图大小并将其附加到视图层次结构."然而,文档并没有让我知道在解除模态视图后如何撤消此过程.
有没有其他人经历过这个并找到了解决方案?
编辑:我遇到了同样的问题,所以我没有问自己的问题,而是赞助了这个问题.这是我的具体情况:
在我的例子中,我通过导航控制器在模态视图控制器中呈现图像选择器:
-(void) chooseImage {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
imagepicker = [[UIImagePickerController alloc] init];
imagepicker.allowsEditing = NO;
imagepicker.delegate = self;
imagepicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagepicker.navigationBar.opaque = true;
imagepicker.wantsFullScreenLayout = NO;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
if (self.view.window != nil) {
popoverController = [[UIPopoverController alloc] initWithContentViewController:imagepicker];
[popoverController presentPopoverFromBarButtonItem:reset permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
} else {}
} else {
[self.navigationController presentModalViewController:imagepicker animated:YES];
}
}
}
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
if (UI_USER_INTERFACE_IDIOM() == …Run Code Online (Sandbox Code Playgroud) cocoa-touch objective-c uinavigationbar modalviewcontroller ios
问题:
在调用状态栏消失后,模态呈现的视图控制器不会向上移动,在顶部留下20px空/透明空间.
正常:没有问题
在电话:没有问题
在呼叫消失后:
在顶部留下20px高的空/透明空间,露出下面的橙色视图.但是,状态栏仍然存在于透明区域上方.导航栏还为状态栏留出空间,它的位置只有20px太低.
我试着听App代表:
willChangeStatusBarFrame
didChangeStatusBarFrame
Run Code Online (Sandbox Code Playgroud)
还可以查看基于控制器的通知:
UIApplicationWillChangeStatusBarFrame
UIApplicationDidChangeStatusBarFrame
Run Code Online (Sandbox Code Playgroud)
当我为所有上述四种方法记录呈现视图的帧时,帧始终位于(y:0)原点.
查看控制器自定义模式演示
let storyboard = UIStoryboard(name: "StoryBoard1", bundle: nil)
self.modalVC = storyboard.instantiateViewController(withIdentifier: "My Modal View Controller") as? MyModalViewController
self.modalVC!.transitioningDelegate = self
self.modalVC.modalPresentationStyle = .custom
self.modalVC.modalPresentationCapturesStatusBarAppearance = true;
self.present(self.modalVC!, animated: true, completion: nil)
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView
let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)
let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)
toViewController!.view.transform = CGAffineTransform(scaleX: 0.001, …Run Code Online (Sandbox Code Playgroud) 我在演示VC中使用以下代码来淡化子模态VC,这很好用:
self.infoViewController.view.alpha = 0.0;
[self.navigationController presentModalViewController:self.infoViewController animated:NO];
[UIView animateWithDuration:0.5
animations:^{self.infoViewController.view.alpha = 1.0;}];
Run Code Online (Sandbox Code Playgroud)
但是我无法让它淡出,我尝试了一些东西,这是我尝试过的最新功能:
- (IBAction)dismissAction:(id)sender
{
if ([[self parentViewController] respondsToSelector:@selector(dismissModalViewControllerAnimated:)])
{
[[self parentViewController] dismissModalViewControllerAnimated:YES];
self.parentViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
self.parentViewController.view.alpha = 0.0;
[UIView animateWithDuration:0.5
animations:^{self.parentViewController.view.alpha = 1.0;}];
} else
{
[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
self.presentedViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
self.presentedViewController.view.alpha = 0.0;
[UIView animateWithDuration:0.5
animations:^{
self.presentedViewController.view.alpha = 1.0;}];
}
Run Code Online (Sandbox Code Playgroud)
}
模态视图控制器淡出但立即消失,而不是像显示时那样.
所以我正在开发一个仅支持横向模式的iPad应用程序,除了在一个模态视图控制器上.我遇到的问题是,一旦我呈现模态视图并将方向更改为纵向然后关闭视图,父视图(应该只支持横向)处于纵向模式,直到我旋转设备然后返回到风景和保持这种方式.我一直在努力弄清楚如何让父母保持原始方向,但却未能找到解决方案.
我在我的app委托中有以下代码,只允许在单个模态视图(GalleryPhotoViewer)上进行方向更改:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;
if(self.window.rootViewController){
UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
//Support Portrait mode only on Photoviewer
if ([[presentedViewController presentedViewController] isKindOfClass:GalleryPhotoViewController.class] ) {
orientations = UIInterfaceOrientationMaskAll;
}else{
orientations = [presentedViewController supportedInterfaceOrientations];
}
}
return orientations;
}
Run Code Online (Sandbox Code Playgroud)
从父类(PhotosViewController)我调用:
GalleryPhotoViewController *gpView = [GalleryPhotoViewController new];
[self presentViewController:gpView animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
在我的父(以及其他视图)中,我有以下代码禁止纵向模式:
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if(interfaceOrientation == UIInterfaceOrientationPortrait) {
return YES;
} else {
return NO;
}
}
Run Code Online (Sandbox Code Playgroud)
关于如何在我的父视图上保持方向的任何想法?一旦模态被解除,我在考虑可能只是以编程方式更改viewWillAppear方法中父级的方向,但后来我不知道之前的方向是什么,更不用说我无法找到代码来执行此操作不管是ios6.
编辑/解决方案:所以我找到了一个解决方案,我最终做的是离开应用程序:supportedInterfaceOrientationsForWindow:代码,只是将UINavigation子类添加到呈现模态视图的父视图中,并且所有内容都按预期工作,父级保留其原始在模态能够自由变化的同时取向. …
我在Xcode 4.2(iOS SDK 5)上使用ShareKit 0.2.1在Twitter上分享文本.它共享很好,但模式视图控制器在单击取消按钮成功共享后不会消失(见下文):

这是我的代码:
-(IBAction)shareOnTwitter:(id)sender{
// Item to share
NSString *text = @"Go away, modal view controller!";
[SHKTwitter shareText:text];
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
cocoa-touch objective-c uiviewcontroller modalviewcontroller sharekit
有没有办法调整使用故事板segue以模态方式呈现的视图控制器?
如何通过翻转过渡从此模态视图控制器呈现另一个视图控制器?
如果我将其定义为Style = Modal,Presentation = Default,Transition = Flip Horizontal它看起来很奇怪(背景为白色).
谢谢!
我希望与iPhone联系人应用程序中的生日日期设置器具有相同的效果.如何才能在屏幕中间显示模态日期选择器.
我希望日期选择器超过UITableView(就像在iphone联系人应用程序中).我希望UITableView能够在日期选择器后面自由滚动(就像在iphone联系人应用程序中一样).
提前致谢.
如何在主视图控制器的顶部显示"半视图"控制器?
要求: - 呈现第二个视图控制器,它在主视图控制器的顶部滑动. - 第二个视图控制器应仅显示主视图控制器的一半以上 - 主视图控制器应保持在第二个视图控制器后面可见(透明背景,下方未显示黑色) - 第二个视图控制器应使用类似于模态垂直覆盖的动画制作动画,或者iOS 7自定义转换 - 当第二个视图控制器处于活动状态时,用户仍然可以与主视图控制器上的按钮交互(即第二个视图控制器不覆盖整个主视图控制器)r - 第二个视图控制器有自己的复杂逻辑(不能简单视图) - 仅限故事板,Segues,iOS 7 - 仅限iPhone,而非iPad.
我尝试过使用模态视图控制器,但这不允许与主视图控制器交互.有人可以提供一个如何使用iOS7自定义转换或其他方法执行此操作的示例.
尝试从模态视图中隐藏状态栏.
已经检查了几种方法:
override func prefersStatusBarHidden() -> Bool {
return true
}
with / without self.setNeedsStatusBarAppearanceUpdate()
Run Code Online (Sandbox Code Playgroud)
也
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .Fade)
Run Code Online (Sandbox Code Playgroud)
但在iOS 9中折旧
这适用于全屏演示(模态segue演示选项),但在全屏幕上注意这是我的设置.
如果你有任何想法..
ios ×8
objective-c ×3
cocoa-touch ×2
statusbar ×2
animation ×1
dismiss ×1
fadeout ×1
hidden ×1
in-call ×1
ios5 ×1
ios6 ×1
ios7 ×1
ipad ×1
iphone ×1
sharekit ×1
storyboard ×1
swift ×1
uidatepicker ×1