iPhone : 自定义标签栏,没有可怕的“更多”菜单

2024-03-25

所以我想构建一个具有超过 5 个项目并且可滚动的选项卡栏并找到本文 http://www.rumex.it/2010/11/how-to-customise-the-tab-bar-uitabbar-in-an-iphone-application-part-2-of-2/。 通过子类化 UITabBarController 并隐藏现有的选项卡栏即可轻松完成:

for(UIView *view in self.view.subviews)
{
    if([view isKindOfClass:[UITabBar class]])
    {
        view.hidden = YES;
        break;
    }
}

然后我只需添加一个 UIScrollView 并根据 tabbarcontroller 的项目集合在其中添加一些按钮。

int i = 0;
for (UITabBarItem *item in self.tabBar.items)
{
    UIView *tab = [[[UIView alloc] initWithFrame:CGRectMake(i*60, 0, 60, 60)] autorelease];

    UIButton *btn = [[[UIButton alloc] initWithFrame:CGRectMake(7.5, 1, 45, 45)] autorelease];
    [btn setImage:item.image forState:UIControlStateNormal];
    btn.tag = i;
    [btn addTarget:self action:@selector(didSelectTabrBarItem:) forControlEvents:UIControlEventTouchUpInside];
    [tab addSubview:btn];

    [self.scrollView addSubview:tab];
    i++;

    if(self.selectedViewController == nil)
        [self setSelectedIndex:0];
}

我正在重写 setSelectedindex/ViewController 因为我需要一些附加绘图。

-(void)setSelectedViewController:(UIViewController *)selectedViewController
{
    [super setSelectedViewController:selectedViewController];
    [self startTimer];
}

-(void)setSelectedIndex:(NSUInteger)selectedIndex
{
    [super setSelectedIndex:selectedIndex];
    [self startTimer];
}

问题是,当我按下 5、6 或 7 号按钮时,选项卡控制器会打开“更多”视图。我如何摆脱它并使最后三个项目像其他项目一样? - 会不会是给超级的电话?

我的猜测是完全终止 UITabBarController 并实现我自己的自定义选项卡栏。但是是否可以禁用更多菜单并让 UITabBarController 像平常一样选择项目 5、6 和 7?


所以,由于我太糟糕了,无法编写一个全新的选项卡栏,所以我决定调查并尝试破解 UITabBarController。

这是解决方案:

实际问题是,当您触摸索引高于 4 的选项卡栏项目时,UITabBarController vil 实际上会显示 moreNavigationController。这是一个 UINavigationController,包含 UIMoreViewControllerList 类型的视图,该类型是来自私有 Cocoa 框架的类型以及您选择的 ViewController 的实例。

那么我们如何摆脱“更多”按钮呢?

只需从 moreNavigationController 集合中删除 UIMoreViewControllerList,只留下您选择的 ViewController。

-(void)setSelectedViewController:(UIViewController *)selectedViewController
{
    [super setSelectedViewController:selectedViewController];

    if([self.moreNavigationController.viewControllers count] > 1)
    {        
        //Modify the view stack to remove the More view
        self.moreNavigationController.viewControllers = [[[NSArray alloc] initWithObjects:self.moreNavigationController.visibleViewController, nil] autorelease];
    }
}

好吧,我们在右上角(标题栏)留下了一个“编辑”按钮。

那么你如何摆脱它呢?

是的。这又是一个肮脏的黑客行为。要删除“编辑”按钮,我实际上必须为自定义 UITabBarController 上的 moreNavigationController 实现 UINavigationControllerDelegate 中的一种方法。

//navigationController delegate
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{

    if ([navigationController isKindOfClass:NSClassFromString(@"UIMoreNavigationController")])
    {     
        // We don't need Edit button in More screen.
        UINavigationBar *morenavbar = navigationController.navigationBar;
        UINavigationItem *morenavitem = morenavbar.topItem;
        morenavitem.rightBarButtonItem = nil;
    }
}

这就是取消默认“更多”功能的方法。我真的认为苹果在这里创建了一个同时处理逻辑和 UI 内容的 UITabBarController ,这是他们尿裤子了。 为什么不创建一个控制器,它具有预加载 ViewController 并在 ViewController 之间切换的逻辑,然后如果您想要更多东西,您可以使用一个实现。 - 甚至更好:可以禁用“更多”功能。

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

iPhone : 自定义标签栏,没有可怕的“更多”菜单 的相关文章

  • 如何将 NSDate 转换为 NSString?

    我想将 NSDate 转换为 NSString 这怎么可能 我尝试了这个 但它不起作用 它正在生成异常 NSString dateToString NSString alloc initWithFormat NSString dateObj
  • 如何在iphone APP中下载facebook和Picasso的图片

    任何人告诉我有关 iphone 中从 facebook 和 picassa 下载图像的功能 我正在其中制作应用程序 我想制作通过我的应用程序从 picassa 和 facebook 下载选定图像的功能 那么我必须做什么 谢谢 查看NSURL
  • 在移动网站中处理 iPhone 事件(如向左滑动)

    iPhone 浏览器是否有可以使用 Javascript 挂钩的特殊事件 例如 如果用户向左滑动 我想执行某个操作 如果有类似的活动 很高兴看到所有这些活动的参考 理想情况下 有一天所有触摸屏移动浏览器都会有一个标准 您可以访问多点触控事件
  • 延迟图像下载完成后更新 UITableViewCell

    异步下载单元格图像后 我在更新 UITableViewCells 时遇到一些问题 我正在使用自定义 UITableViewCells 如下所示 UITableViewCell tableView UITableView tableView
  • iPhone AVFoundation 相机方向

    我一直在绞尽脑汁地试图让 AVFoundation 相机以正确的方向 即设备方向 捕获图片 但我无法让它工作 我看过教程 看过 WWDC 演示 还下载了 WWDC 示例程序 但即使这样也没有成功 我的应用程序的代码是 AVCaptureCo
  • 步行、自行车和公共交通路线以及每种方式所需的时间,iPhone

    我正在使用以下网址来获取两个位置之间的行车路线 NSString apiUrlStr NSString stringWithFormat http maps google com maps output dragdir saddr dadd
  • 如何从 iOS 应用程序检测不安全的 wifi 网络

    我想检测我的应用程序中是否存在不安全的 wifi 网络 是否有任何公共 iOS API 可以实现相同的目的 没有记录的 API 可以获取该信息 如果您的应用程序需要通过网络发送和接收敏感数据 您通常应该假设没有安全连接
  • CGContextSelectFont 等效项

    在 iOS 7 CGContext SelectFont 中已弃用 已弃用的消息说我必须使用 Core Text 但我不知道哪一个与这段代码完全相同 CGContextSelectFont context Helvetica kBarLab
  • 应用程序更新时的 iPhone 数据迁移

    我正在开发一个 iPhone 应用程序 它使用 sqlite 来存储应用程序和用户数据 这是该应用程序的第一个版本 我想知道我需要做什么来为该应用程序的未来版本做准备 这够了吗 1 确保 XCode 项目设置中的应用程序版本正确 2 在sq
  • 无需 iPhone 6 Plus 即可预览 iOS 应用程序

    我已经在 Yosemite 中使用 iPhone 6 和 Quicktime 完成了 iOS 应用程序预览 视频 但我无法在 iTunes Connect 中为 iPhone 6 上传它 而且我没有 iPhone 6 设备 有没有办法在没有
  • 我如何从 iPhone 设备获取电子邮件历史记录..?

    friends 我想从我的 iPhone 访问电子邮件历史记录 并且还希望在收到新邮件时收到通知 如果可能的话 请向我提供源代码片段 Thanks 简而言之 使用任何已记录的 API 都是不可能的
  • 与 Objective-C 的 VPN 连接

    有没有办法在 iPhone 的 Objective C 中以编程方式建立 VPN 连接 有这方面的好教程吗 有人知道吗 多谢 我认为第三方应用程序无法访问这些 API
  • 为具有多个目标和不同平台的项目编写 Podfile

    我正在准备一个支持 OS X 和 iOS 的 Pod 我的 pod 有一些自己的依赖项 这些依赖项在 podspec 文件中定义 因此我使用 Podfile 来管理我用来开发 pod 和运行测试的项目的依赖项 我正在使用 CocoaPods
  • 如何为图层阴影不透明度设置动画?

    我有一个视图 我已将 LayerOpacity 设置为 1 theView layer shadowOpacity 1 0 当视图位于屏幕下方时 这看起来很好 当我将此视图向上移动以与另一个有阴影的视图齐平时 它们看起来不太好 有没有办法让
  • 在情节提要中将 Segue 拖至自身

    我想将一个 Segue 从我的视图控制器拖到其自身 所以我可以推送该特定视图控制器的 无限 实例 我知道如何在代码中执行此操作 即以编程方式实例化视图控制器 但是 我想尽可能使用 segues 我发现了一些在故事板中进行自我延续的 技巧 但
  • 如何检索 iPhone 的区域设置

    我用谷歌搜索过它 但令我有点惊讶的是我找不到它 我只想访问设备配置的区域设置 我试图找到如何列出所有系统属性 以防我能在那里找到区域设置 但甚至找不到如何做到这一点 我知道 认为 我之前检索过系统属性 但我也记得在谷歌搜索时找到该信息并不容
  • iPhone SDK中的短信正文

    我需要从我的 iPhone 应用程序发送短信 SMS 的正文是以编程方式创建的 因此 当我点击按钮时 短信应用程序应该打开 并在其中预先输入我的消息 有人知道怎么做吗 需要帮忙 提前致谢 世宾 您无法设置短信正文 根据官方 SDK 您可以从
  • 游戏中心邀请处理程序,它属于哪里?

    我已经搜索了该网站并发现了这个 GameCenter 邀请处理程序 https stackoverflow com questions 4639284 gamecenter invitation handler He says 正如文档中所
  • HTML 分页

    有没有html分页的开源项目 我正在为 iPhone 开发一个应用程序 我想在 UIWebView 上显示 HTML 文件 并且不希望用户向下滚动以查看屏幕上未显示的剩余内容 我想在第二个 UIWebView 上显示剩余的内容 我怎样才能做
  • 将自定义图像设置为 UIBarButtonItem 但它不显示任何图像

    我想将自定义图像设置为 UIBarButtonItem 但它只显示周围的矩形框并且不显示实际图像 func setupBrowserToolbar let browser UIToolbar frame CGRect x 0 y 20 wi

随机推荐

  • 现有模型和数据库表的rails g脚手架

    我想创建一个结构rails g scaffold Article 但我已经创建了表Articles和型号Articles 有什么办法可以做到这一点吗 rails generate scaffold controller Article
  • 如何在Plotly(python)中设置背景颜色,标题?

    下面是我的代码 有人可以告诉我如何设置背景颜色 标题 x轴y轴标签 scatterplot plot Scatter x x index y x rating mode markers marker dict size 10 color x
  • PHP 中的 Switch-Case 和 If-Else 有什么区别?

    我正在决定是否使用if else vs switch case在我正在编写的一个 PHP 网站中 我想知道使用其中之一是否有任何好处 或者是否在某些情况下打算使用其中一种而不是另一种 有趣的问题 因为在编译语言 甚至是 JIT 语言 中 使
  • 使 'week' 函数为双周

    嗨 这一切应该是一个简单的问题 我只是似乎无法弄清楚 我想每两周分解一次该数据集 以便以两周为间隔查看年度周期 我不想总结或汇总数据 我想做的正是 周 函数正在做的事情 但每两周一次 下面是数据和代码的示例 任何帮助将不胜感激 DF lt
  • 棋盘坐标

    我正在尝试用 Java 创建一个国际象棋程序 现在 我已经将棋盘与现有的部件一起完成 我可以用鼠标通过拖放来移动它们 我需要的是向两侧的方块添加坐标 就像在真正的板上一样 不一定要有什么奇特的东西 只是一个视觉效果 由于我没有使用图形绘制板
  • 使用触发器将数据从 SQL Server 插入到 MySql

    我有两个数据库 一个在 SQL Server 中 另一个在 MySql 中 我想在 SQL Server 表中进行插入时将数据插入 MySQL 表中 是否可以在 SQL Server 中使用触发器 请给我一个答案 您可以从以下位置创建连接M
  • 可以触发流选择特定文件

    我的程序连续读取流hadoop文件夹 比如 hadoopPath 它从上面的文件夹中选取所有文件 我可以只显示该文件夹的特定文件类型吗 例如 hadoopPath log 我还有一个与 Spark 和流媒体相关的问题 Spark Strea
  • 在 Kinect 示例中用 Google Earth 地球仪替换可平移的世界地图图像

    我需要有关如何使用 Kinect 手势而不是使用鼠标 键盘导航来控制 Google 地球的基本指导 我已经运行了 Kinect Developer 工具包示例 并且有一个名为 C 的交互式画廊 允许平移世界地图 它是静态图像 这是其文档的链
  • Firebase函数-查询firestore

    我试图从云函数中的 firestore 检索一些数据 但什么也没有得到 客户端上的相同查询给出了正确的结果 这可能是小事 但我没有看到问题 我究竟做错了什么 const functions require firebase function
  • 使用范围,如何将 .COPY DESTINATION 粘贴为值

    我有以下代码 可以很好地将整个单元格复制到新的目的地 Dim ws As Worksheet rng As Range Set ws Sheets Duplicates Set rng ws Range A2 rng Copy Destin
  • 在 Get-ADUser 筛选器参数中传递字符串会导致错误 - 在 pscustomobject 中找不到属性

    我正在尝试创建一个新的 Active Directory 用户 但首先我验证该用户不存在Get ADUser 我从人力资源部门导入用户数据并构建自定义属性 newUsers Import Csv csvFile Select Object
  • 如何查看 int 数组中的元素是否为空?

    example 我想看看是否array 5 保存一个值或者为空 原始数组中的元素不能为空 它们总是会被初始化为某些东西 通常是0 for int数组 但取决于您如何声明数组 如果您像这样声明数组 例如 int myArray myArray
  • 以编程方式执行 spring roo

    我查看了 spring roo 我发现我们可以使用命令提示符生成实体 控制器和其他实体 但我需要从文本框中获取实体名称和字段名称作为用户输入 然后使用 roo 生成项目 我正在使用Windows 您可以创建脚本文件 然后使用 roo 执行该
  • Internet Explorer 和 jQuery 的“权限被拒绝”

    我尝试使用 jQuery 进行 AJAX 调用 post在 Internet Explorer 中 但我得到的只是一条错误消息 权限被拒绝 这个问题有点奇怪 因为只有当我在访问任何其他页面之后访问一个页面时才会出现这种情况 例如 我在地址行
  • 无法使用 firebase 函数获取 req.path 和 req.query.abc

    我正在尝试获取请求查询参数和网址firebase functions 这是我正在使用的代码 firebase json hosting public build rewrites source getCoins function getCo
  • Java - 如何测试 Catch 块?

    有点转发 但是关于没有足够声誉的第 22 条军规意味着我无法对任何重复的线程发表评论 咳嗽 我正在尝试使用 Mockito 测试 try catch 的 catch 块 是否可以使模拟抛出由正在测试的方法处理的异常 我无法使用 doThro
  • 为什么 return 不遵守finally 块中变量的值?

    finally总是最后执行 所以语句x 3应该最后执行 但是 运行此代码时 返回的值为 2 Why class Test public static void main String args System out println fina
  • 使用 AVPlayer 进行串流速度很慢

    我使用 AVPlayer 从互联网上传输 mp3 文件 但它的运行速度非常慢 使用探查器 我发现它首先下载整个文件 然后开始播放 有什么解决方法吗 现在 我正在使用这段代码 if let player player Notification
  • 使用预先签名的 URL 将文件放入 S3

    我整夜都在使用 Amazon S3 预签名 URL 来尝试 PUT 文件 我在 java 代码中生成预签名 URL AWSCredentials credentials new BasicAWSCredentials accessKey s
  • iPhone : 自定义标签栏,没有可怕的“更多”菜单

    所以我想构建一个具有超过 5 个项目并且可滚动的选项卡栏并找到本文 http www rumex it 2010 11 how to customise the tab bar uitabbar in an iphone applicati