文章目录
在开始之前,得先说说对于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
解析为系统默认最小化行为
标签栏不最小化
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还支持取消滑块功能,设置sliderStyle为UISliderStyleThumbless 即可

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

在多窗口的情况下,mainScreen 这个概念已经不能准确地代表您的代码运行所在的那个屏幕了
当前最推荐的解决方案是通过当前的"场景"(Scene)上下文来获取屏幕信息
objectivec
UIWindowScene *windowScene = (UIWindowScene *)scene;
self.window.frame = windowScene.screen.bounds;
这里的Scene为方法传入参数
实际上对iOS来说,分屏浏览可能还需要很久才会更新,但是这个属性被废弃确实会影响到项目的开发,所以在这里稍微提一下