我有一个以模态方式呈现的观点。这是 iOS 13/14 中向下滑动关闭功能的一部分。
当用户开始关闭模态视图时,我收到此委托调用:
func presentationControllerWillDismiss(_ presentationController: UIPresentationController) {
}
Run Code Online (Sandbox Code Playgroud)
一旦用户开始向下拖动视图,就会调用此函数。但是,它可以被取消。
一旦视图完成关闭,以下调用就会给我:
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
}
Run Code Online (Sandbox Code Playgroud)
我需要知道用户何时完成关闭手势以及视图将完成关闭。
我能够向前迈出几步,但仍然缺少上述所需的检测:
func presentationControllerWillDismiss(_ presentationController: UIPresentationController) {
//User started dismissing, with no guarantee
self.transitionCoordinator!.animate(alongsideTransition: {(context: UIViewControllerTransitionCoordinatorContext) -> Void in
//Dismissal is animating. Could be finishing or canceling the dismissal
}, completion: {( context: UIViewControllerTransitionCoordinatorContext) -> Void in
if context.isCancelled {
//Dismissal got cancelled
} else {
//Dismissal has completed. Too Late!
}
})
}
Run Code Online (Sandbox Code Playgroud) 当用户按下按钮时,我有一个视图控制器(视图A)呈现模态视图(B),视图B本身有一个按钮来呈现视图C.我的问题是如果用户在视图B或视图B时退出应用程序显示C,下次启动应用程序时将显示相同的视图.有没有办法在退出时关闭视图B和C,或者在应用程序启动时显示视图A?谢谢你的帮助
有没有办法在呈现模态视图控制器时控制部分卷曲效果的效果?在地图应用程序中,部分卷曲不会像我在我的应用程序中使用时那样高.基本上我只是想模仿页面卷曲,就像它在地图应用程序中一样.
谢谢
我试图从视图控制器B呈现模态视图控制器C.B的视图不覆盖整个屏幕,并且是另一个视图控制器的子视图,A.当我尝试呈现全屏模态时我看到的是模态覆盖整个屏幕,但是当我点击屏幕中的某些位置时,控件将"传递"到A的视图.
我可以通过某种授权从A中呈现模态来绕过这一点,但我不知道为什么会发生这种情况!毕竟,如果你有一个标签栏控制器来管理你的一个视图,并且你试图呈现一个模态视图,它就可以完全覆盖整个屏幕.幕后有什么魔法吗?
在我的应用程序中,我有一个按钮,当用户点击它时,它会弹出一个模态视图控制器,它获取用户的位置(带有UIActivityIndicator图像和图像).当它有位置时,它会将它们发送到另一个应用程序.
这适用于较旧的设备(没有多任务处理),因为应用程序在我返回之后只是重新启动回到之前的状态.
但是在具有多任务处理的设备上,当我恢复应用程序时,告诉用户它正在获取其位置的视图仍然存在 - 这根本不是所希望的.
我的第一个想法是设置一个BOOL,当它要将它们发送到另一个应用程序时,然后在viewDidAppear,如果BOOL为真,则关闭模态视图.
如果viewDidAppear在应用程序恢复活动时被调用,那将会有效.正如我刚才所了解的那样,事实并非如此.
有一种方法,视图控制器可以响应应用程序恢复活动到该视图的时间吗?或者,我是否必须与应用代表一起设置委托等?如果是这样,你能解释一下我会怎么做吗?
我有一个模态视图控制器,UITextView成为第一个响应者,键盘显示.
加载此屏幕后,用户可以在提交之前对其输入进行分类.这通过顶部呈现的另一个模态视图控制器发生.
当呈现第二个键盘时,键盘被解除,用户选择,然后当初始UITextView再次成为第一响应者时再次出现.
如何在不解除键盘的情况下呈现第二个模态视图控制器?
编辑:我已经实现了UITextViewDelegate的一部分,我仍然没有得到所需的结果.
- (BOOL)textViewShouldEndEditing:(UITextView *)textView {
return NO;
}
Run Code Online (Sandbox Code Playgroud) 我有一个模态视图控制器,我用UIModalPresentationPageSheet显示.问题是他的默认大小对我的内容来说太大了:所以我想调整大小是根据我的内容进行调整.
有没有人知道这样做的方法/技巧?
谢谢
frame ipad modalviewcontroller uimodalpresentationstyle cgrect
我的故事板看起来像这样:

这是它的工作原理:在其.m文件中InitialSlidingViewController实例化导航VC topViewController,如下所示:
-(void)viewDidLoad {
[super viewDidLoad];
self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Navigation"];
}
Run Code Online (Sandbox Code Playgroud)
导航VC实例化后,它会创建基础菜单并将其设置为underLeftVC.这是使用ECSlidingViewController.这将创建一个使用平移手势的滑动菜单,类似于Facebook.
NavigationVC的rootVC是我的ItemsCDTVC.当我点击+按钮时,它会弹出一个动作表,允许我从相机拍摄照片或从照片库中选择.但是,我希望它以模态方式转换为ManageItemVC并设置我刚刚选择/拍摄到UIImageView的图片.当我尝试呈现时,它会抛出以下错误:
Warning: Attempt to present <ManageItemViewController: 0x81d52a0> on <InitialSlidingViewController: 0x8122ce0> whose view is not in the window hierarchy!
Run Code Online (Sandbox Code Playgroud)
这是真的,因为InitialSlidingVC不在屏幕上,ItemCDTVC是,但我该如何解决这个问题呢?
我在我的故事板中设置了模态类型segue,其中包含来自底部灵活空间的标识符(当点击时,它没有做任何事情,所以我选择了它来创建视觉segue).这是我在ItemCDTVC中的segue代码:
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
// let's get the edited image
UIImage *image = info[UIImagePickerControllerEditedImage];
// but if for some reason we disable editing in the future, this is our safeguard
if(!image) image = info[UIImagePickerControllerOriginalImage];
if(image) {
self.pictureImageView.image = image;
[self performSegueWithIdentifier:@"addItemSegue" …Run Code Online (Sandbox Code Playgroud) objective-c uiimagepickercontroller uinavigationcontroller modalviewcontroller segue
我有3个viewControllers - BaseViewController-> AviewController-> BviewController.
AviewController在BaseViewController上以模态方式呈现,BviewController在AviewController上以模态方式呈现.
在AviewController中,如果我调用[self dismissViewControllerAnimated:Completion]它,则会关闭AviewController和BviewController.
在BviewController中如果我调用[self.presentingViewController dismissViewControllerAnimated:completion]它只会解散BviewController.为什么AviewController没有被解雇?
这个概念是错误的AviewController = BviewController.presentingViewController.?
我也尝试在BviewContrroller中使用AviewController的弱引用并试图解雇.但仍然只有BviewController被解雇.即[AviewControllerReference dismissViewControllerAnimated:completion]
我理解这个概念有什么错误吗?
我想在呈现模态的视图控制器中检测到模态解雇。
这种方法对于在新的卡模式上检测到新的iOS 13滑动解雇效果非常好:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MyIdentifier" {
segue.destination.presentationController?.delegate = self
}
}
extension MyController: UIAdaptivePresentationControllerDelegate {
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
//clean up UI (de-selecting stuff) once modal has been dismissed
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果模态通过动作以编程方式自行退出,则不会调用presentationControllerDidDismiss:
@IBAction func btnDismissTap(_ sender: Any) {
self.dismiss(animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
这是一个错误,还是有一种方法可以通过编程方式调用任何“滑动”关闭,以便我可以相同的方式检测所有关闭?目前,我正在为我的模态编写额外的“解雇”委托方法,以解决此问题,这似乎是不必要的。