Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone:我如何构建自己的TabBar?_Iphone_Ios_Uiview_Uitabbarcontroller_Uitabbar - Fatal编程技术网

iPhone:我如何构建自己的TabBar?

iPhone:我如何构建自己的TabBar?,iphone,ios,uiview,uitabbarcontroller,uitabbar,Iphone,Ios,Uiview,Uitabbarcontroller,Uitabbar,因为我对tabbar有一些普通iphone tabbar无法提供的要求,所以我需要构建自己的tabbar 构建我自己的选项卡栏的最佳方法是什么?具体来说,如何在主视图控制器中以正确的方式添加/删除(显示/隐藏)视图,同时考虑子视图的内存和最佳做法?这取决于您的应用程序。如果您能够在内存中保留分配给选项卡栏的所有视图控制器,那么您可以使用一个简单的数组来存储所有适当的视图控制器,并使用该数组中的索引来显示它们。 创建自定义视图控制器也是一个好主意,它将存储自己的选项卡栏图像(和/或标题)。您的选项

因为我对tabbar有一些普通iphone tabbar无法提供的要求,所以我需要构建自己的tabbar


构建我自己的选项卡栏的最佳方法是什么?具体来说,如何在主视图控制器中以正确的方式添加/删除(显示/隐藏)视图,同时考虑子视图的内存和最佳做法?

这取决于您的应用程序。如果您能够在内存中保留分配给选项卡栏的所有视图控制器,那么您可以使用一个简单的数组来存储所有适当的视图控制器,并使用该数组中的索引来显示它们。 创建自定义视图控制器也是一个好主意,它将存储自己的选项卡栏图像(和/或标题)。您的选项卡栏将从中获取所有值


如果您负担不起这么多内存(但不太可能),那么您可以将NSDictionary存储在阵列中,而不是视图控制器。当用户点击tabbar项时,您只需卸载上一个视图控制器并使用该字典中的参数创建新的视图控制器。或者,您可以使用一些自定义的容器类来代替字典。

正如我在其他地方所说的,摆脱
UIKit
提供的核心导航类几乎从来都不是一个好主意。您认为哪些类型的应用程序需求值得完全定制选项卡栏类?几乎总是可以通过子类化、分类或使用层来实现必要的定制

更新1:下面是我在一些应用程序中实现自定义选项卡栏的步骤

  • 创建
    uitabar
  • 向自定义子类添加一个名为
    -updateTabBarImageForViewControllerIndex:
  • 在Interface Builder中,将选项卡栏控制器的选项卡栏的类更改为自定义子类
  • 在符合选项卡栏控制器委托的任何类(例如,应用程序委托)中,在自定义选项卡栏子类上实现
    -tabbar控制器:应选择ViewController:
    ,并调用
    -updateTabBarImageForViewControllerIndex:
  • 基本上,每次选项卡栏控制器要切换视图控制器时,都要通知选项卡栏子类。发生这种情况时,请确定需要为选项卡栏选择的图像。您的选项卡栏应该有
    n
    图像,每个选项卡的选定状态对应一个图像。实际上可以伪造
    uitabaritem
    的实现,只处理单个图像,但这需要更多的工作

    // MyAppDelegate.m
    
    - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
    {
        // Determine the index based on the selected view controller
    
        NSUInteger viewControllerIndex = ...;
    
        [(MyTabBar *)tabBarController.tabBar updateTabBarImageForViewControllerIndex:viewControllerIndex];
    
        return YES;
    }
    
    // MyTabBar.m
    
    - (void)updateTabBarImageForViewControllerIndex:(NSUInteger)index
    {
        // Determine the image name based on the selected view controller index
    
        self.selectedTabBarImage = [UIImage imageNamed:...];
    
        [self setNeedsDisplay];
    }
    
    - (void)drawRect:(CGRect)rect
    {
        CGContextDrawImage(UIGraphicsGetCurrentContext(), rect, self.selectedTabBarImage.CGImage);
    }
    
    更新2:现在我仔细考虑了一下,您实际上可以(也应该)不必对
    uitabar
    进行子类化就可以实现您想要实现的目标。导入
    并利用图层内容。:)


    这两个公认的答案在iOS5中出现。我所做的是保留自定义选项卡栏子类,只保留此方法不变:

    - (void)drawRect:(CGRect)rect
    {
       CGContextDrawImage(UIGraphicsGetCurrentContext(), rect, nil);
    } 
    
    然后在MainWindow.xib中,我创建了一个自定义视图,其中imageview作为背景,UIButtons作为选项卡栏项

    在TabController委托中,我更新按钮的选定状态

    - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
    {
     // Determine the index based on the selected view controller
    
     UIButton *newBtn;
    
     if(viewController == homeVC) {
       ...
     }
     // Update the buttons
     newBtn.selected = YES;
     _selectedTabBtn.selected = NO;
     _selectedTabBtn = newBtn;
    
     return YES;
    }
    

    正常的UITabBar是否将所有视图加载到内存中?是的。从文档-(void)setViewControllers:(NSArray*)viewControllers已设置动画:(BOOL)已设置动画,因此您首先必须创建视图控制器。通过制作自己的选项卡栏(控制器),
    UIKit
    ,您已经完成了95%的工作。为什么不通过一些简单的子类化或层内容操作来完成5%的工作呢?事实上,关于UITabBar[Controller],苹果真的不喜欢你对它进行子类化。这是可以做到的,但是你经常会失败,因为他们有很多assert()来阻止你这么做。当我在dev论坛上问到这个问题时,答案是“自己滚”。(事实上,我没有这样做,但一路上也有痛苦和痛苦。)如果您要做的只是通过重写
    -drawRect:
    来定制样式,那么子类化没有什么错。是的,您不想覆盖任何改变底层逻辑的方法,但是如果您做得恰当,子类化也没有什么害处。在任何情况下,如果可以的话,这就是我建议只使用层的原因。不需要子类或分类。Lucas。我需要更改覆盖颜色和文本颜色。据我所见,这样做可能会导致我的应用程序被拒绝。我过去也这样做过,但我的应用程序没有被拒绝。诚然,这是很久以前的事了,但我所做的只是对适当的组件进行子类化,并使用
    -drawRect:
    方法来实现我想要的效果。所有其他繁重的工作都落在了基类上。使用-drawRect可以自定义tabbaritems的覆盖颜色和文本颜色?在iOS5中,它们可以自定义tabbar,因此这不再是一个问题。您有新文档的链接吗?在UITabBarItem、UITabBar或UITabBarController中找不到任何内容。有新的背景图像、SelectedImage tintColor、selectionIndicatorImage和tintColor属性。看看XCode 4.2文档,你会在iOS 5库中看到它。啊,我现在看到了。这是可行的,但我的解决方案对于那些希望向后兼容iOS4的人可能仍然有用。
    - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
    {
     // Determine the index based on the selected view controller
    
     UIButton *newBtn;
    
     if(viewController == homeVC) {
       ...
     }
     // Update the buttons
     newBtn.selected = YES;
     _selectedTabBtn.selected = NO;
     _selectedTabBtn = newBtn;
    
     return YES;
    }