MST

星途 面试题库

面试题:Objective-C中怎样实现标签栏不同状态下(选中与未选中)的图标和文字样式自定义?

假设项目需求为标签栏在选中状态下图标变大且文字加粗,未选中状态恢复正常。请用Objective-C实现这一功能,并说明其中涉及到的关键类和方法,以及如何管理标签栏的不同视图控制器。
27.8万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 实现标签栏选中效果的Objective-C代码
    • 首先,创建一个继承自UITabBarController的自定义类,例如CustomTabBarController
    #import "CustomTabBarController.h"
    
    @interface CustomTabBarController () <UITabBarControllerDelegate>
    
    @end
    
    @implementation CustomTabBarController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.delegate = self;
        // 初始化标签栏的各个视图控制器
        UIViewController *vc1 = [[UIViewController alloc] init];
        vc1.title = @"Tab1";
        UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:vc1];
        nav1.tabBarItem.title = @"Tab1";
        nav1.tabBarItem.image = [UIImage systemImageNamed:@"square"];
    
        UIViewController *vc2 = [[UIViewController alloc] init];
        vc2.title = @"Tab2";
        UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:vc2];
        nav2.tabBarItem.title = @"Tab2";
        nav2.tabBarItem.image = [UIImage systemImageNamed:@"circle"];
    
        self.viewControllers = @[nav1, nav2];
    }
    
    - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
        for (UITabBarItem *item in tabBarController.tabBar.items) {
            if (item == viewController.tabBarItem) {
                item.imageInsets = UIEdgeInsetsMake(-5, 0, 5, 0);
                item.titleTextAttributes = @{NSFontAttributeName : [UIFont boldSystemFontOfSize:14]};
            } else {
                item.imageInsets = UIEdgeInsetsZero;
                item.titleTextAttributes = @{NSFontAttributeName : [UIFont systemFontOfSize:12]};
            }
        }
    }
    @end
    
  2. 关键类和方法
    • UITabBarController:这是管理标签栏的主要类,用于管理多个视图控制器,并在屏幕底部显示标签栏。
    • UITabBarItem:每个标签栏选项对应的类,用于设置标签栏的图标、标题等属性。
    • UIViewController:视图控制器类,每个标签栏选项通常对应一个视图控制器。
    • tabBarController:didSelectViewController:UITabBarControllerDelegate协议中的方法,当用户点击标签栏的某个选项时会调用此方法。在这个方法中,可以根据选中的视图控制器来设置对应的UITabBarItem的属性,如改变图标大小(通过imageInsets)和文字加粗(通过titleTextAttributes)。
  3. 管理标签栏的不同视图控制器
    • 初始化视图控制器:在CustomTabBarControllerviewDidLoad方法中,创建并初始化每个标签栏对应的视图控制器。通常会将视图控制器包装在UINavigationController中,以提供导航功能。例如:
    UIViewController *vc1 = [[UIViewController alloc] init];
    vc1.title = @"Tab1";
    UINavigationController *nav1 = [[UINavigationController alloc] initWithRootViewController:vc1];
    nav1.tabBarItem.title = @"Tab1";
    nav1.tabBarItem.image = [UIImage systemImageNamed:@"square"];
    
    • 设置视图控制器数组:通过设置UITabBarControllerviewControllers属性,将所有需要显示在标签栏的视图控制器(或包装它们的UINavigationController)添加到数组中,如下:
    self.viewControllers = @[nav1, nav2];
    
    • 切换视图控制器:当用户点击标签栏的某个选项时,UITabBarController会自动切换到对应的视图控制器。同时,tabBarController:didSelectViewController:方法会被调用,可以在这个方法中进行选中状态的样式调整。