【OC】UIKit常用组件适配iOS 26

文章目录

在开始之前,得先说说对于iOS 26的设计理念

iOS 26最重要的就是引入了液态玻璃效果,液态玻璃结合了玻璃的光学特性和流动性。这种材料为控制和导航元素形成了一个独特的功能层。它会影响界面的外观、感觉和移动方式,根据各种因素进行调整,以帮助将焦点放在基础内容上

所以在使用液态玻璃效果的时候,一定要注意不要让液态玻璃效果影响到用户的可读性,我们只需要将液态玻璃效果控制在重要的部分即可

同时,为了适配液态玻璃效果,我们应该尽可能的减少自定义背景,并让系统决定背景外观

接下来我将讲解一下目前苹果对UIKit上适配的一些常见的液态玻璃效果供参考

UITabBarController

使用26的风格显示TabBar

我们先从TabBar开始

TabBar是一个并列结构的容器视图控制器,他的功能是给用户提供几个并列的选择

在iOS 26中,如果你使用系统图标,且不增加自定义背景,ios 26会自动将控制器设置为液态玻璃效果

如果使用自定义背景来实现tabBar,就会出现这种情况

objectivec 复制代码
NSArray* tabBar = [NSArray arrayWithObjects:recommendNav,swimmingNav,musicPlayerNav,keyNoteNav,personalFileNav, nil];
    // 去除startTabBar的边界线
    startTabBar.tabBar.layer.borderWidth = 0;
    
    startTabBar.viewControllers = tabBar;
    
    startTabBar.tabBar.backgroundColor = [UIColor clearColor];
    
    startTabBar.tabBar.barTintColor = [UIColor systemBackgroundColor];
    startTabBar.tabBar.tintColor = [UIColor labelColor];
    
    startTabBar.tabBar.translucent = YES;

明显,在设置背景后,tabBar并没有像Apple设计的那样浮在内容显示区上,而是遮盖了部分内容

我们将背景颜色去除(即使是clear Color也会影响TabBar的显示!)

即可正常显示TabBar

在滑动时最小化TabBar

除了悬浮显示TabBar,26还可以在滑动的时候隐藏TabBar来凸显内容

objectivec 复制代码
    startTabBar.tabBarMinimizeBehavior = UITabBarMinimizeBehaviorOnScrollDown;

tabBarMinimizeBehavior是一个控制tabBar什么时候隐藏的属性

objectivec 复制代码
@property (nonatomic, assign) UITabBarMinimizeBehavior tabBarMinimizeBehavior API_AVAILABLE(ios(26.0), tvos(26.0), visionos(26.0)) API_UNAVAILABLE(watchos);

他是一个枚举值,在未设置情况下为UITabBarMinimizeBehaviorAutomatic

UITabBarMinimizeBehaviorAutomatic

解析为系统默认最小化行为

UITabBarMinimizeBehaviorNever

标签栏不最小化

UITabBarMinimizeBehaviorOnScrollDown

向下滚动时,标签栏会最小化,向上滚动时会展开

UITabBarMinimizeBehaviorOnScrollUp

向上滚动时,标签栏会最小化,向下滚动时会展开。如果滚动视图内容与底部对齐,则推荐使用

效果:

<>

附加视图

iOS 26可以在TabBar上显示一个小的附加视图,例如播放器控制器

要设置这个效果,我们需要设置TabBar的属性bottomAccessory

objectivec 复制代码
@property (nonatomic, strong, nullable) UITabAccessory *bottomAccessory API_AVAILABLE(ios(26.0)) API_UNAVAILABLE(visionos) API_UNAVAILABLE(watchos, tvos);

这个属性接受一个之前没有的类,UITabAccessory

创建这个类目前的方法就是- initWithContentView:

这个方法接收一个UIView 类型,所以实际上我们创建一个UIView类型的子类即可

objectivec 复制代码
- (instancetype)initWithFrame:(CGRect)frame {
    return [self initWithIsPlaying:NO];
}

- (instancetype)initWithIsPlaying:(BOOL)playing {
    self = [super initWithFrame:CGRectZero];
    if (self) {
        _isPlaying = playing;
        [self setupSubviews];
        [self configureSubviews];
        [self setupLayoutConstraints];
    }
    return self;
}

这是大体初始化的一个思路,在这里不展示过多的具体代码了

向下滑动,补充视图会自动填充到合适的位置

在收回补充视图的时候,可以注意到补充视图空间有变化

补充视图的变化可以读取TabBar的traitCollection中的tabAccessoryEnvironment 属性

tabAccessoryEnvironment 属性同样也是一个枚举值

可以通过检测属性来更新UI,这里就不做演示了

控制组件

控件经过重新设计,在外表上焕然一新,但是整体与之前保持一致

UISwitch的大小有所不同,所以检查一下switch控件是否适应整体大小布局

UIButton

UIButton的样式适配大部分从**UIButtonConfiguration**适配

UIButtonConfiguration 新增四个类方法

objectivec 复制代码
+ (instancetype) glassButtonConfiguration;
+ (instancetype) prominentGlassButtonConfiguration;
+ (instancetype) clearGlassButtonConfiguration;
+ (instancetype) prominentClearGlassButtonConfiguration;

分别对应4种不同的按钮样式

UISlider

UISlider的更新除了官方自动的拇指滑块的动态效果,现在还支持刻度调节

使用**trackConfiguration** 属性来设置刻度

UISliderTrackConfiguration 有两个类方法,可以让你根据简单的数字或者数组来设置刻度

同时,UISlider还支持取消滑块功能,设置sliderStyleUISliderStyleThumbless 即可

其他方面

由于iPad OS 26更加注重多屏幕浏览,所以在UIKit里,我们常用的mainScreen被废弃了(默哀1分钟)

在多窗口的情况下,mainScreen 这个概念已经不能准确地代表您的代码运行所在的那个屏幕了

当前最推荐的解决方案是通过当前的"场景"(Scene)上下文来获取屏幕信息

objectivec 复制代码
UIWindowScene *windowScene = (UIWindowScene *)scene;
self.window.frame = windowScene.screen.bounds;

这里的Scene为方法传入参数

实际上对iOS来说,分屏浏览可能还需要很久才会更新,但是这个属性被废弃确实会影响到项目的开发,所以在这里稍微提一下

相关推荐
用户2235862182020 小时前
WebKit WebPage API 的引入尝试与自研实现
ios
啦啦啦!21 小时前
ChatGPT和Gemini的接入和封装
人工智能·ios·chatgpt
aosky21 小时前
手机远程畅玩OpenAI Codex
macos·智能手机·cocoa
报错小能手1 天前
ios开发方向——swift并发进阶核心 async/await 详解
开发语言·ios·swift
开心就好20251 天前
HTTPS超文本传输安全协议全面解析与工作原理
后端·ios
Digitally1 天前
荣耀手机数据迁移至 iPhone 教程
智能手机·cocoa·iphone
牛马1111 天前
Flutter iOS 权限配置完整指南(定位权限)
flutter·ios
A_QXBlms1 天前
多账号轮询架构 — 利用企销宝iPad协议突破单账号群发次数限制
ios·架构·ipad
HH思️️无邪1 天前
Flutter + iOS 实战指南:教程视频 PiP + 退桌面(可复用模板)
flutter·ios
A懿轩A1 天前
【2026 最新】Python 下载与安装:在 macOS 下使用 Homebrew 和 pyenv 完美管理多版本 Python
python·macos·mac