iOS开发针对苹果新系统iOS26的兼容适配UITabBarButtonItem & UITabBar的液态玻璃效果/当前wifi ssid获取

1. UITabBarButtonItem液态玻璃效果

        兼容处理:

        第一种方式(不推荐):把所有的UITabBarButtonItem关闭液态玻璃效果:

 if (@available(iOS 26.0, *)) { self.navigationItem.rightBarButtonItem.hidesSharedBackground = YES; self.navigationItem.leftBarButtonItem.hidesSharedBackground = YES; } else { // Fallback on earlier versions }

        第二种方式:所有导航栏按钮全部采用UITabBarButtonItem,支持液态玻璃效果。

        第三种方式:降低Xcode版本到Xcode25及以下版本,然后再打包

        第四种方式:使用兼容模式显示传统UI风格,也就是取消TabBar液态玻璃效果:

        打开info.plist,添加一个Boolean键值对,取消液态玻璃效果,添加完成后重新运行,UITabBar恢复旧的样式:

<key>UIDesignRequiresCompatibility</key> <true/>

2.  采用UILayoutFittingExpandedSize设置自定义的navigationItem.titleView的内容尺寸,在iOS26上高度偏大,高度变为屏幕的高度,预期是高度应该为导航栏的高度;

原因:在iOS26之前UILayoutFittingExpandedSize最大尺寸限制在导航栏范围内,而在iOS26则允许充斥整个屏幕:

- (CGSize)intrinsicContentSize { return UILayoutFittingExpandedSize; }

        兼容处理:

        修改intrinsicContentSize,指定titleView的尺寸大小为导航栏大小:

 #define SCREEN_WIDTH ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]?[UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale:[UIScreen mainScreen].bounds.size.width) - (CGSize)intrinsicContentSize { return CGSizeMake(SCREEN_WIDTH, 44); }

3、UITabBarController调用self.setValue(yourTabBar, forKey: "tabBar")自定义tabBar失效

        原因:iOS 26 之后对 UITabBarController 的 KVC 注入限制,导致无效,但不会crash

        兼容处理:

        方案1:使用兼容模式显示传统UI风格,也就是取消TabBar液态玻璃效果:

        打开info.plist,添加一个Boolean键值对,取消液态玻璃效果,添加完成后重新运行,UITabBar恢复旧的样式:

<key>UIDesignRequiresCompatibility</key> <true/>

        方案2:改为使用系统的UITabBarItem组件,能够支持新系统的液态玻璃效果

        方案3:降低Xcode版本到Xcode25及以下版本,然后再打包

4、创建一个由URL标识的代表任何资源的assert对象时报错:

AVAssetExportSessionStatusFailed: Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成" UserInfo={ NSUnderlyingError=0x1586626a0 { Error Domain=NSOSStatusErrorDomain Code=-16979 "(null)" }, NSLocalizedFailureReason=发生未知错误(-16979), NSURL=file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV, NSLocalizedDescription=这项操作无法完成 }

        原因:AVAssetExportSession -11800 / -16979 转码失败,权限不足、文件不可读,创建一个由URL标识的代表任何资源的assert对象时,传入的originFilePath示例: file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV,没有读的权限,因为iOS 26对相册视频读取权限收紧,代码示例:

//originFilePath示例: file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV AVURLAsset *asset = [AVURLAsset URLAssetWithURL:originFilePath options:nil]; 

        兼容处理:先将相册的视频拷贝到 App 沙盒临时目录,然后再去创建资源对象AVURLAsset

 [self copyVideoToSandbox:originFilePath completion:^(NSURL *localUrl) { AVURLAsset *asset = [AVURLAsset URLAssetWithURL:localUrl options:nil]; }]; - (void)copyVideoToSandbox:(NSURL *)originUrl completion:(void (^)(NSURL *localUrl))completion { NSString *temp = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tempVideo.mov"]; NSURL *localUrl = [NSURL fileURLWithPath:temp]; NSFileManager *fm = [NSFileManager defaultManager]; if ([fm fileExistsAtPath:temp]) { [fm removeItemAtPath:temp error:nil]; } NSError *err = nil; BOOL ok = [fm copyItemAtURL:originUrl toURL:localUrl error:&err]; if (!ok || err) { NSLog(@"拷贝失败: %@", err); completion(nil); return; } completion(localUrl); } 

5. 通过CNCopySupportedInterfaces获取wifi ssid的方式已失效:

 class func getWifiSSID() -> String? { var wifiName: let wifiInterfaces = CNCopySupportedInterfaces() if wifiInterfaces != nil { let interfaceArr = CFBridgingRetain(wifiInterfaces) as! [String] if interfaceArr.count > 0 { let interfaceName = interfaceArr[0] as CFString let ussafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName) if ussafeInterfaceData != nil { let interfaceData = ussafeInterfaceData as! [String: Any] wifiName = interfaceData["SSID"] as? String ?? "" } else { return nil } } } return wifiName }

        原因:iOS26不再推荐使用CNCopySupportedInterfaces,在iOS26将返回空值

        兼容处理:Capabilities添加Access WiFi Information权限;通过CLLocationManager确保有定位权限,然后使用NEHotspotNetwork获取wifi ssid:

NEHotspotNetwork.fetchCurrent { curNetwork in block(curNetwork?.ssid ?? "") }

Read more

Stable Diffusion WebUI完全攻略:从零基础到AI绘画大师

Stable Diffusion WebUI完全攻略:从零基础到AI绘画大师 【免费下载链接】stable-diffusion-webuiAUTOMATIC1111/stable-diffusion-webui - 一个为Stable Diffusion模型提供的Web界面,使用Gradio库实现,允许用户通过Web界面使用Stable Diffusion进行图像生成。 项目地址: https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui 想要用文字创造精美图像吗?Stable Diffusion WebUI 作为基于Gradio库构建的Web界面,让任何人都能轻松使用Stable Diffusion进行AI绘画创作。本文将带你从基础操作到高级技巧,全面掌握这个强大的AI绘画工具。 基础入门:发现AI绘画的无限可能 创意生成模块:文字到图像的魔法转换 Stable Diffusion WebUI 的核心功能分为两大创意模块: 界面探索之旅:认识你的创作工作室 从界面布局可以看出,整个创作环境分为三大功

AI绘画新姿势:Z-Image-Turbo_UI界面详细使用说明

AI绘画新姿势:Z-Image-Turbo_UI界面详细使用说明 Z-Image-Turbo 是当前生成质量与速度兼顾的轻量级文生图模型代表,8步即可输出1024×1024高清图像,细节丰富、风格稳定、响应迅速。而 Z-Image-Turbo_UI 界面正是为它量身打造的开箱即用型图形交互环境——无需写代码、不碰命令行、不配环境,打开浏览器就能开始创作。 本篇不是部署教程,也不是原理剖析,而是一份真正面向新手的 UI 操作说明书。从第一次点击到保存第一张作品,从调整参数到管理历史记录,所有操作都以“你正在用”为前提,一步一图、一图一解,确保你花15分钟就能上手,30分钟就能产出满意作品。 1. 启动服务:两行命令,模型就位 Z-Image-Turbo_UI 是一个基于 Gradio 构建的本地 Web 应用,运行后会在你的电脑上启动一个微型服务器,所有计算都在本地 GPU 完成,不上传数据、不依赖网络、不绑定账号。

SenseVoice-small保姆级教程:WebUI自定义CSS主题更换与UI界面美化指南

SenseVoice-small保姆级教程:WebUI自定义CSS主题更换与UI界面美化指南 1. 引言:为什么需要美化你的语音识别界面? 你可能已经用上了SenseVoice-small这个强大的语音识别工具,它能帮你把会议录音转成文字、给视频加字幕,支持几十种语言,还带情感识别,功能确实很实用。但每次打开那个默认的Web界面,是不是总觉得少了点什么?灰扑扑的配色、千篇一律的布局,用久了难免有些审美疲劳。 其实,这个Web界面是基于Gradio框架搭建的,它有一个很棒的特性——支持自定义CSS主题。这意味着你不需要懂复杂的后端开发,只需要写几行CSS代码,就能让界面焕然一新。想象一下,把工作台变成你喜欢的深色模式,或者给界面加上公司品牌的配色,甚至调整按钮和布局让它更符合你的操作习惯。 今天这篇教程,就是手把手教你如何给SenseVoice-small的WebUI“换皮肤”。我会从最基础的CSS修改讲起,带你一步步实现界面美化,最后还会分享几个现成的主题模板,让你一键应用。无论你是前端小白还是有点CSS基础,都能跟着做出来。 2. 准备工作:找到WebUI的“化妆间”

ViT图像分类模型Web应用开发:从模型部署到前端展示

ViT图像分类模型Web应用开发:从模型部署到前端展示 1. 项目概述与价值 想象一下,你拍了一张桌上的物品照片,上传到一个网页,瞬间就能识别出杯子、手机、笔记本等所有物品——这就是我们要构建的ViT图像分类Web应用。这种技术现在已经广泛应用于电商平台的智能搜图、内容平台的自动打标、智能相册的物体识别等场景。 基于ViT(Vision Transformer)的图像分类模型,特别是针对中文日常物品训练的版本,能够识别1300多种常见物体,覆盖日用品、动物、植物、家具、设备、食物等类别。通过Web应用的形式,我们可以让这个强大的AI能力变得触手可及。 2. 技术架构设计 2.1 整体架构 我们的Web应用采用前后端分离架构,这样既保证了系统的可扩展性,也便于团队协作开发。后端使用FastAPI提供RESTful API服务,前端采用Vue.js构建交互界面,模型服务基于ModelScope的ViT图像分类模型。 这种架构的好处很明显:前后端可以独立开发和部署,API接口清晰明确,而且能够很好地支持未来的功能扩展。对于刚接触全栈开发的工程师来说,这种设计也相对容易理解和