我UIViewControllerTransitioningDelegate用来在两个视图控制器(从a MKMapView)到构建在(AVFoundation)上的自定义Camera 之间构建自定义转换.一切顺利,直到我打电话presentViewController,手机似乎挂了大约1秒钟(当我记录所有东西时).这甚至似乎发生在我转换到更简单的视图时(我有一个视图控制器只显示一个UITextview,甚至在实际调用转换之前似乎有大约.4 - .5秒的延迟).
这是我现在称之为过渡的方式
dispatch_async(dispatch_get_main_queue(), ^{
UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
CameraViewController *cvc2 = [sb instantiateViewControllerWithIdentifier:@"Camera"];
cvc2.modalPresentationStyle = UIModalPresentationFullScreen; // Needed for custom animations to work
cvc2.transitioningDelegate = self; //Conforms to the UIViewControllerTransitioningDelegate protocol
[self presentViewController:cvc2 animated:YES completion:nil];
});
Run Code Online (Sandbox Code Playgroud)
这是我animateTransition打电话的方法.非常直接,目前呈现此视图的视图上只有一个MkMapView(没有其他视图或方法).
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
if (self.type == MapAnimationTypePresent) {//From map to another view
UIView *containerView = [transitionContext containerView];
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = …Run Code Online (Sandbox Code Playgroud) avfoundation uiviewcontroller mkmapview ios presentviewcontroller
在应用程序启动期间,通常会创建主UI结构,但如果用户在应用程序启动期间未登录,则会立即在普通UI上方显示模态介绍/登录屏幕.
通常情况下,使用提供模态UI一直很好presentViewController:animated:NO,因为用户会看到:App Launch Image - > Login UI.
但是,在iOS 8上,似乎调用presentViewControlleranimated = NO 仍会在呈现视图控制器之前简要地显示帧的基础视图控制器.
例:
我不想首先提供登录UI,因为当用户登录时,我将从登录UI 呈现主UI,从而无限期地保持层次结构中的登录UI.
还有其他方法我没有考虑过吗?故事板可以帮助我吗?
更新:通过下面的"屏幕截图"方法大纲修复.这有效但有更优雅的方式吗?
我如何解除一堆带有动画的模态视图控制器而不在屏幕上闪烁顶部和底部之间的任何呈现的VC?尝试使用动画执行此操作无效.请参阅下面的代码和描述我的问题的内联注释.您可以将此代码复制/粘贴到Xcode中的新项目中,以便亲自查看您是否愿意!
//
// ViewController.m
// MultipleModals
//
#import "ViewController.h"
#import "MyViewController.h"
#import "MyHelper.h"
@interface ViewController ()
@end
@implementation ViewController
static BOOL doAgain = YES; // So when red appears again, we don't endlessly cycle (for testing)
- (void)viewDidAppear:(BOOL)animated
{
// Invoke super
[super viewDidAppear:animated];
// Prevent loop when we dismiss all the way back to red (for testing)
if (doAgain)
{
// Okay here's where the demo code starts...
// PRESENTING a full stack of modals WITHOUT animation WORKS …Run Code Online (Sandbox Code Playgroud) 当我将 viewController 推送到 navigationController 时,我想从下到上显示动画?有人知道这样做吗?
RegisterViewController *registerView = (RegisterViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"RegisterViewController"];
Run Code Online (Sandbox Code Playgroud)
展示
[self presentViewController:registerView animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
解雇
[self dismissViewControllerAnimated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
有什么办法可以在导航控制器中实现这一点吗?
objective-c show-hide uinavigationcontroller ios presentviewcontroller
我有一些自定义模式呈现和自定义控制器要呈现(UIViewController 的子类)。它是它自己的转换委托,并返回一些动画转换对象和表示控制器。我使用动画过渡对象在呈现时将呈现的视图添加到容器视图,并在关闭时将其删除,当然还可以对其进行动画处理。我使用演示控制器添加一些辅助子视图。
public final class PopoverPresentationController: UIPresentationController {
private let touchForwardingView = TouchForwardingView()
override public func presentationTransitionWillBegin() {
super.presentationTransitionWillBegin()
self.containerView?.insertSubview(touchForwardingView, atIndex: 0)
}
}
public final class PopoverAnimatedTransitioning: NSObject, UIViewControllerAnimatedTransitioning {
func setupView(containerView: UIView, presentedView: UIView) {
//adds presented view to container view
}
public func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
//1. setup views
//2. animate presentation or dismissal
}
}
public class PopoverViewController: UIViewController, UIViewControllerTransitioningDelegate {
init(...) {
...
modalPresentationStyle = .Custom
transitioningDelegate = self
}
public func animationControllerForPresentedController(presented: UIViewController, presentingController …Run Code Online (Sandbox Code Playgroud) uikit uiviewanimationtransition ios presentviewcontroller uipresentationcontroller
问题是我不知道如何解雇和呈现只有一个过渡动画的视图控制器.
我的故事板结构是:
我们可以说A控制器是在NavigationController之后,B是Startup引用,C是TabBar ViewController.既乙和Ç与一个模态呈现交叉溶解过渡.
当用户登录到应用程序(来自B)时,C控制器以模态方式呈现,具有翻转水平过渡.当用户注销(来自C)时,B以相同的方式呈现.在A控制器上,我根据用户是否记录执行直接segue到B或C.
我的问题是如果我不从B或C中解除以前的视图控制器,那么该控制器就会泄露.相反,如果我解除它,则在呈现目标控制器(B或C)之前显示A.
是否可以仅显示" 水平翻转"和"查看"视图?
我有一个视图控制器FromViewController,我希望它呈现ToViewController一个自定义过渡。我已经UIViewControllerAnimatedTransitioning为 to- 和 from-转换实现了,当我呈现和关闭ToViewController.
但是,如果 myFromViewController包含在 a 中,UINavigationController当我关闭ToViewController.
这是UIViewControllerAnimatedTransitioning解雇时的代码:
- (void)animateTransition:(nonnull id<UIViewControllerContextTransitioning>)transitionContext {
self.toViewController = (ToViewController *)
[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UINavigationController *navigationController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
self.fromViewController = (FromViewController *)navigationController.topViewController;
self.containerView = transitionContext.containerView;
[self.containerView insertSubview:self.fromViewController.view belowSubview:self.toViewController.view];
// My animations go here
// In the animation completion block I call:
[transitionContext completeTransition:!transitionContext.transitionWasCancelled]; // this is when my screen goes black
}
Run Code Online (Sandbox Code Playgroud)
我已经检查了该应用程序,并且在解雇后似乎既不存在UINavigationController也不FromViewController在视图层次结构中。
uiviewcontroller uinavigationcontroller ios presentviewcontroller
我正在尝试present使用视图控制器,以防状态(一个Int?)为零,如下所示:
guard let statusCode = status else {
DispatchQueue.main.async() {
let initViewController = self.storyboard!.instantiateViewController(withIdentifier: "SignInViewController")
self.present(initViewController, animated: false, completion: nil)
}
return
}
Run Code Online (Sandbox Code Playgroud)
我想知道这是否是最佳实践,因为在呈现视图控制器后返回并没有多大意义,但它在guard语句中是必需的,因为guard语句不能落空。
如何使用 SwiftUI 实现以下 Objective-C 代码实现的功能?我一直无法牢牢掌握所提出的想法。
[self presentViewController:messageViewController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud) 我有通过sheetPresentationController推送的视图控制器:
let addRSSSheetVC = AddRSSSheetViewController()
let navigationController = UINavigationController(rootViewController: addRSSSheetVC)
if let sheet = navigationController.sheetPresentationController {
sheet.detents = [.medium()]
}
present(navigationController, animated: true)
Run Code Online (Sandbox Code Playgroud)
当存在的表看起来像这样:
但是当我单击文本字段和键盘时,它会将工作表视图向上推:
如何在不推送页面的情况下在呈现的视图控制器上方呈现键盘?
ios ×9
ios8 ×2
swift ×2
uikit ×2
avfoundation ×1
guard ×1
ios7 ×1
mkmapview ×1
objective-c ×1
show-hide ×1
swiftui ×1
uikeyboard ×1
view ×1