【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来说,分屏浏览可能还需要很久才会更新,但是这个属性被废弃确实会影响到项目的开发,所以在这里稍微提一下

相关推荐
zhu_superman5 小时前
Git 中忽略 Mac 生成的 .DS_Store文件
git·macos
sztomarch6 小时前
Generate-MAC-Address
macos
心灵宝贝7 小时前
Keka for Mac v1.2.0 安装教程|pkg 文件安装步骤详解(附安装包)
macos
我来杀ai7 小时前
mac在uup上下载windows镜像
macos
ii_best9 小时前
按键精灵安卓/iOS脚本辅助,OpenCV实现自动化高效率工具
ios·自动化·编辑器·安卓
蒲公英少年带我飞9 小时前
iOS底层原理:Method Swizzling原理和注意事项
ios
蒲公英少年带我飞9 小时前
iOS底层原理:KVC分析
ios
2501_915921439 小时前
iOS混淆与IPA加固全流程(iOS混淆 IPA加固 Ipa Guard实战)
android·ios·小程序·https·uni-app·iphone·webview