tabBar 存在时出现奇怪的定位问题

2024-03-29

我们有一个带有 UIPickerView 和工具栏 (216 + 44) 的自定义视图。在初始化时 (viewDidLoad),使用以下代码将此自定义视图推送到屏幕下方。

   CGPoint newOrigin;
   newOrigin.x = pickerViewOutlet.frame.size.width/2;
   newOrigin.y = self.view.frame.size.height + ((pickerViewOutlet.frame.size.height)/2);
   NSLog(@"%f,%f",self.view.frame.size.height,(pickerViewOutlet.frame.size.height)/2);
   pickerViewOutlet.center = CGPointMake(newOrigin.x, newOrigin.y);

单击按钮时,将使用以下代码段拉出此视图。

   [self.view bringSubviewToFront:pickerViewOutlet];
   NSLog(@"tabbar %f",self.tabBarController.tabBar.frame.size.height);
   CGPoint showOrigin;
   showOrigin.x = pickerViewOutlet.frame.size.width/2;
   showOrigin.y = pickerViewOutlet.center.y - pickerViewOutlet.frame.size.height;
      //self.tabBarController.tabBar.frame.size.height ;
   NSLog(@"showpicker %f,%f",pickerViewOutlet.center.y,pickerViewOutlet.frame.size.height);
   [UIView beginAnimations:nil context:NULL];

   [UIView setAnimationBeginsFromCurrentState:YES];

   [UIView setAnimationDuration:0.5];
   pickerViewOutlet.center=CGPointMake(showOrigin.x, showOrigin.y);


   [UIView commitAnimations];
   [pickerCtrlOutlet reloadAllComponents];

这很好用。然而,当页面上存在底部选项卡栏控制器时,这不起作用(视图的一部分位于选项卡栏下方),即使代码被修改为

showOrigin.y = pickerViewOutlet.center.y - pickerViewOutlet.frame.size.height -  self.tabBarController.tabBar.frame.size.height ;

但是如果上面的代码修改为

showOrigin.y = pickerViewOutlet.center.y - pickerViewOutlet.frame.size.height -  self.tabBarController.tabBar.frame.size.height - 90;

它在视图位于选项卡栏正上方的情况下完美运行。


据我所知,在 viewDidLoad 中self.view尚未添加到超级视图,因此框架未设置为正确的尺寸。

例如,您可以在InterfaceBuilder中设计一个UIView,它将具有320x460。当您将其添加到超级视图时,由于底部标签栏的原因,它实际上会变得更小。自动调整大小机制可以帮助解决这个问题。

因此,我认为您在 viewDidLoad 中使用错误的值来定位选取器视图,然后当您使用相对于旧位置的新位置时,它仍然会是错误的。

我会这样写:

   [self.view bringSubviewToFront:pickerViewOutlet];
   NSLog(@"tabbar %f",self.tabBarController.tabBar.frame.size.height);
   CGPoint showOrigin;

   showOrigin.x = pickerViewOutlet.frame.size.width/2;
   //Notice this line -----------
   showOrigin.y = self.view.frame.size.height - pickerViewOutlet.frame.size.height / 2;

      //self.tabBarController.tabBar.frame.size.height ;
   NSLog(@"showpicker %f,%f",pickerViewOutlet.center.y,pickerViewOutlet.frame.size.height);
   [UIView beginAnimations:nil context:NULL];

   [UIView setAnimationBeginsFromCurrentState:YES];

   [UIView setAnimationDuration:0.5];
   pickerViewOutlet.center=CGPointMake(showOrigin.x, showOrigin.y);


   [UIView commitAnimations];
   [pickerCtrlOutlet reloadAllComponents];

Notice showOrigin.y = self.view.frame.size.height - ...

并且(额外加分:)您可以将选取器视图的自动调整大小蒙版设置为“灵活顶部”(或者锁定底部坐标)。如果这样做,即使您在 viewDidLoad 中定位选取器视图,然后调整 self.view 的大小,选取器视图也会更改其位置。

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

tabBar 存在时出现奇怪的定位问题 的相关文章

随机推荐

  • Github认为合并后分支不同

    我已经被这个 Github 问题撞到墙上了 终于来到这里寻求帮助 我的repo https github com KAPSARC KTAB有两个感兴趣的分支 master 这是当前实时发布的分支 并且alternate testing 这正
  • Magento 获取 phtml 文件上使用的布局

    有没有办法可以获取某个 phtml 文件使用的布局 就我而言 我想检查catalog list phtml 上使用的布局 我使用该信息对产品图像网格大小进行条件 if 我试着用谷歌搜索一下 但所有的结果只是解释有关 xml 布局的事情 我得
  • Grails 从域验证器获取会话变量

    我确信这是一个常见的情况 但我还没有找到任何答案 我有一个会话范围的变量 用于保存当前登录的用户 我需要通过域对象中的自定义验证器来执行条件验证 有没有办法在验证器中从会话范围中获取当前用户 或者是否有其他方法可以做到这一点 请记住我希望能
  • 子类如何调用与子类的方法名相同的超类的方法?

    include
  • 尝试为每个 Web 请求实现会话,没有当前会话上下文配置

    正如我在标题中所说 我想为每个网络请求实现会话 我的会话提供程序是这样配置的 我对更改此配置不感兴趣 public class SessionProvider public static SessionProvider Instance g
  • 向 Google Cloud Firestore 上传和下载文件

    我看到 Firebase 已经发布了一个新的测试版 名为 Cloud Firestore 在文档中 文档的所有操作都描述得非常好 但我无法找到有关使用 Android 将媒体文件上传和下载到 Cloud Firestore 的任何信息 有人
  • 重写 php 应用程序以获得 seo 友好的 url

    我有 php 应用程序 由于客户要求拥有 SEO 友好的 url 因此必须部分重写 我的链接如下 www mysite com articles en php artid 89 我必须更改其中的网址 www mysite com artic
  • 使用Subject 和Observable 之间有什么区别,各自的用途是什么?

    我了解了制作 Observable 的两种不同方法 第一个是一个主题 如下所示 file A const message new Subject file B message subscribe message gt console log
  • 保留解密加密数据库的解密密钥的最佳方法是什么?

    我有一个加密的数据库和解密密钥 如何使解密密钥免受黑客攻击 数据库黑客攻击和未经授权的 PC 访问 汇编中的硬编码 保存在注册表中 保存在内存中 此外 我需要加密数据的算法 在每个解密时间期限的安全性方面 执行此操作的最佳算法是什么 RSA
  • GNU 日期和自定义格式

    我有一些特定日期格式的字符串 我想使用 GNU date 命令 coreutils 8 20 来处理它们 我可以使用 FORMAT 字符串获取要输出的日期 但不能理解使用相同字符串输入的字符串 我很确定我错过了一些明显的东西 是什么赋予了
  • 函数返回与不返回?

    返回还是不返回 是函数的问题 或者说 这真的很重要吗 故事就这样开始了 我曾经编写如下代码 Type3 myFunc Type1 input1 Type2 input2 但最近我的项目学院告诉我 我应该尽可能避免编写这样的函数 并建议采用以
  • 如何从里程计/tf数据获取投影矩阵?

    我想将视觉里程计的结果与 KITTI 数据集提供的事实进行比较 对于地面中的每一帧 我都有一个投影矩阵 例如 1 000000e 00 9 043683e 12 2 326809e 11 1 110223e 16 9 043683e 12
  • 如何在 MongoDB 中执行 SQL Join 等效操作?

    如何在 MongoDB 中执行 SQL Join 等效操作 例如 假设您有两个集合 用户和评论 我想提取 pid 444 的所有评论以及每个集合的用户信息 comments uid 12345 pid 444 comment blah ui
  • 如何从android发送数据到mysql服务器?

    我是android开发的新手 我正在使用 Android Studio 我正在制作一个应用程序 其中有一个名称下拉列表 选择任何名称后 相应的ID该名称显示在应用程序中 然后有一个按钮将搜索用户当前的 GPS 坐标并将其显示在应用程序上 我
  • 非线性条件断点

    是否可以设置断点 使程序在指令满足某些条件后停止执行true 一个类有一个名为的变量currency我想设置一个断点 使程序在之后的任何行停止currency 20 我不知道行号在哪里currency已更改 因此这就像在其中放置一个断点每行
  • 将 PDF 转换为 PNG Node.JS

    我正在构建一个 Node js 应用程序来将 PDF 转换为 PNG 并显示在用户页面上 该应用程序将像这样工作 用户上传 PDF 到服务器 服务器将 PDF 页面转换为单独的 PNG 在用户页面上显示 PNG 我发现了一个很棒的软件包 名
  • 在 Silverlight 8.1 应用程序中注册后台任务

    我正在开发一个使用 BLE 与某个项目通信的应用程序 我需要从它接收后台通知 我知道存在GattCharacteristicNotificationTrigger但我找不到任何方法在 Silverlight 8 1 应用程序中注册后台任务
  • 固定卡满足 FITS 标准是什么意思?

    我正在尝试使用 FITS 文件 我有以下代码 from astropy io import fits from astropy wcs import WCS hdul fits open fitsfilename 0 wcs WCS hdu
  • 在 jsf 页面中使用 commandButton 来下载文件

    使用 jsf 页面中的命令按钮下载文件 使用 JSF 和 Richfaces 我有一个表 扩展 ExtendedDataModel 实现可修改 可序列化 其中包含一些数据 并且每行都有一个 下载 按钮
  • tabBar 存在时出现奇怪的定位问题

    我们有一个带有 UIPickerView 和工具栏 216 44 的自定义视图 在初始化时 viewDidLoad 使用以下代码将此自定义视图推送到屏幕下方 CGPoint newOrigin newOrigin x pickerViewO