在自定义模式中呈现 UINavigationController

2023-12-05

我正在尝试从 UINavigationController 呈现 UINavigationController。我正在使用新的 iOS 7 transitioningDelegate 东西,它工作得很好......除了导航栏开始时很高,然后在动画结束时缩小。我假设它缩小了,因为条形图没有接触屏幕顶部,但为什么它一开始就很高呢?我可以阻止这种情况吗?

Notice the bar starts tall

这是动画代码:

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {

    UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* containerView = [transitionContext containerView];

    if (toViewController.isBeingPresented) {
        [self presentModalView:toViewController.view fromView:fromViewController.view inContainerView:containerView withTransitionContext:transitionContext];
    } else {
        [self dismissModalView:fromViewController.view fromView:toViewController.view withTransitionContext:transitionContext];
    }
}

- (void)presentModalView:(UIView*)modalView fromView:(UIView*)presentationView inContainerView:(UIView*)containerView withTransitionContext:(id<UIViewControllerContextTransitioning>)transitionContext {
    [containerView addSubview:modalView];
    presentationView.userInteractionEnabled = NO;

    modalView.layer.cornerRadius = 5;
    modalView.clipsToBounds = YES;

    CGRect finalFrame = CGRectInset(presentationView.frame, 10, 20);
    modalView.frame = CGRectOffset(finalFrame, 0, CGRectGetHeight(presentationView.frame));

    [UIView animateWithDuration:animationDuration animations:^{
        modalView.frame = finalFrame;
        presentationView.alpha = 0.2;
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];
    }];
}

我有一个解决这个问题的方法。

From http://blog.jaredsinclair.com/post/61507315630/wrestling-with-status-bars-and-navigation-bars-on-ios-7,第 4 号:

UINavigationController 会将其 UINavigationBar 的高度更改为 44 点或 64 点,具体取决于一组相当奇怪且未记录的约束。如果 UINavigationController 检测到其视图框架的顶部与其 UIWindow 的顶部在视觉上是连续的,那么它会绘制高度为 64 点的导航栏。如果其视图的顶部与 UIWindow 的顶部不连续(即使仅偏离一点),则它将以“传统”方式绘制导航栏,高度为 44 点。此逻辑由 UINavigationController 执行,即使它是应用程序视图控制器层次结构内部的多个子级。没有办法阻止这种行为。

因此,你的问题是UINavigationController正在检测其视图的框架与UIWindow位于动画开头的顶部。这是因为当您添加modalView作为子视图containerView,modalView的frame为{0,0,0,0}。因为该框架在视觉上与UIWindow的顶部,UINavigationController绘制其UINavigationBar高度为64点。动画完成后,导航控制器的新框架不再与窗口顶部连续,并绘制高度为 44 的导航栏。

一种解决方案是在设置其框架后将导航控制器的视图添加到容器视图中。就像这样,

 - (void)presentModalView:(UIView*)modalView fromView:(UIView*)presentationView inContainerView:(UIView*)containerView withTransitionContext:(id<UIViewControllerContextTransitioning>)transitionContext {
    presentationView.userInteractionEnabled = NO;

    modalView.layer.cornerRadius = 5;
    modalView.clipsToBounds = YES;

    CGRect finalFrame = CGRectInset(presentationView.frame, 10, 20);
    modalView.frame = CGRectOffset(finalFrame, 0, CGRectGetHeight(presentationView.frame));
    [containerView addSubview:modalView];

    [UIView animateWithDuration:animationDuration animations:^{
        modalView.frame = finalFrame;
        presentationView.alpha = 0.2;
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];
    }];
}

这应该可以解决您的问题,因为在整个动画中导航栏始终以 44 点的高度绘制。我不知道有什么方法可以将导航栏的高度保持在 64 点,因为这会欺骗导航控制器,使其认为它与窗口顶部相邻。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在自定义模式中呈现 UINavigationController 的相关文章

  • UIBezierPath containsPoint:无法正常工作?(更新:超级视图中的触摸位置如何处理?)

    所以我有 2 个视图可以绘制贝塞尔路径然后返回路径 然后我需要检查路径是否包含我在以下帮助下执行此操作的点 path containsPoint currentObject position 它适用于其中一种观点 但不适用于另一种观点 一个
  • iOS 初学者:带有 3 个按钮的 UIAlertView 窗口 > 检查按下了什么按钮

    我有一个教程中的工作代码 但不完全理解它 情况 在我的 iPhone 应用程序中按下按钮后 将出现一个包含三个按钮的 AlertView 现在我想检查用户按下了什么按钮 教程中的代码 IBAction infoButtonPressed i
  • 转发 UIAlertView 的可变参数

    我正在尝试设置一个非常简单的UIAlertView带有文本编辑 确定和取消按钮 我想根据文本编辑的内容禁用确定按钮 为了能够保留委托 以便他不会在警报视图之前消失 从而在用户对警报视图执行某些操作时立即导致崩溃 我对其进行了子类化 现在 我
  • iOS wifi扫描、信号强度

    据我所知 不可能扫描范围内的热点并读取它们的 bssid 和信号强度 这在 iOS 4 上可以通过使用私有 API 实现 但在不越狱的 iOS 5 上则不再可能 即使可能 该应用程序也会在 App Store 上被拒绝 是对的吗 一家拥有室
  • 类型名称已知却未知?

    Xcode 突然显示了此错误 未知类型名称 我会解释一下 我的 StoriesViewController h import
  • App Store Connect 上传错误“您尚未获得云管理分发证书的访问权限”

    使用 Xcode 将 iOS 应用程序上传到 App Store Connect 自动管理签名 并收到此错误 查找和生成签名资产时发生以下错误 与苹果通讯失败 您尚未获得云管理分发证书的访问权限 请联系您团队的帐户持有人或管理员以授予您访问
  • 我怎样才能完成笛卡尔积函数的 Objective-C 实现?

    作为我的问题的后续here https stackoverflow com questions 8176719 algorithm generating all combinations from items that must be ch
  • 转换任何对象?到字符串

    我有一个返回 AnyObject 的函数 func aFunction param String gt AnyObject 如何将其转换为字符串 和字符串 尝试这个 if let result aFunction test as Strin
  • 从电话号码确定国际电话代码的算法

    我可以使用 iOS 上的地址簿框架从设备中检索联系人的电话号码 如何区分或识别哪个是国家 地区代码 哪个是实际电话号码 是否可以 国家 地区代码是一个相当混乱的主题 但足够标准 通过一些程序员维护就可以解决它 您可以通过其初始子序列来识别国
  • iPhone 应用程序中的 iOS 7 状态栏恢复为 iOS 6 默认样式?

    在 iOS 7 中UIStatusBar它的设计方式是与视图合并 如下所示 GUI designed by Tina Tav ar http dribbble com shots 1183911 Side menu and status b
  • 如何在 Objective-C 中的导航栏中央添加图像?

    我正在IOS中开发 我使用以下代码来设置背景navigationBar self navigationController navigationBar setBackgroundImage UIImage imageNamed bar ba
  • 翻转通过CVOpenGLESTexture获得的OpenGL ES纹理

    在我尝试 OpenGL ES 2 0 的最后一天 当我尝试将两个投影纹理 一个精灵动画和一个视频文件纹理 应用到天空盒时 我开始像存根一样简单地用手敲击键盘 奇迹般地它就成功了 一切都开始工作了 然而 从视频文件创建的纹理是颠倒的 换句话说
  • NSTextview:如何获取插入点的字形矩形?自定义文本视图?

    我似乎找不到任何有关如何获取插入点的矩形的文档 我试图在文本插入点 插入点正下方显示一个视图 如自动完成 我正在考虑制作一个自定义文本视图 但如果我可以避免它 那对我的情况来说将是理想的 谢谢 NSRect rectForActiveRan
  • iOS 版 Google 地图 SDK 中的热图

    有没有办法添加热图图层适用于 iOS 的 Google 地图 SDK https developers google com maps documentation ios 注意 我指的是存在于Javascript 版本的 Google 地图
  • exc_bad_access 于 [NSDate timeIntervalSinceReferenceDate]

    我的行为很奇怪 NSDate timeIntervalSinceReferenceDate 我有以下功能 void insertRow NSTimeInterval timeNow NSDate timeIntervalSinceRefer
  • 如何显示启动图像

    我是 iOS 新手 我的 Xcode 版本是 7 2 1 我尝试使用 Swift 在 iOS9 上运行 我的问题是我对如何创建启动屏幕图像感到非常困惑 我发现有很多方法可以为不同版本的 iOS 创建启动屏幕图像 有人可以向我解释一下如何设置
  • 具有自定义视图的相机

    我的应用程序使用相机 我想在相机预览上添加叠加层 例如 我想在使用相机时使用相框 还想添加一个用于相机操作的自定义栏 请帮助我做同样的事情 您可能正在尝试使用 UIImagePickerController 但我知道这个可以解决你的问题 您
  • Xamarin Form - IOS:如何检测 UIView 大小已更改

    我使用 ContentView 创建了一个 Xamarin 表单 并为 Android 创建了一个渲染器 现在我必须为 IOS 创建一个渲染器 在 android 渲染器中 我可以重写 onSizeChanged 并将这些宽度 高度值传递给
  • 使用 Xcode 6 XLIFF 导出的 iOS 本地化/国际化设置 Bungle

    背景 Xcode 6 添加了快速导出功能 可为每种语言创建单个 XLIFF 文件 只需从文件导航器中选择您的项目 然后选择菜单项编辑器 导出以进行本地化 Issue 它工作得非常好 并且 XML 中包含了所有内容 除了设置捆绑字符串 有人有
  • 如何使 CSS 动画/过渡以固定速度而不是固定持续时间播放? [复制]

    这个问题在这里已经有答案了 我有一个 CSS 动画 可以使元素沿直线移动未定义的距离 据我所知 动画具有固定的持续时间 因此无论元素必须移动多远 动画始终需要相同的时间来运行 我该如何制作才能使动画没有固定的duration 但有固定的运动

随机推荐