在iOS 26设备上,活动视图控制器中的服务图标太大
在一个极简的视图控制器中,除了一个用于分享的右上角按钮之外别无他物,当分享表单弹出时,服务图标在iOS 26+设备和模拟器上显得过大且彼此重叠;而iOS 18的布局显示正确。
我说“极简”是因为我已经尝试排除任何可能由实际的视图控制器/我要使用的分享表单本身引起的潜在布局问题。
关闭Liquid Glass引擎并不会对图标大小产生影响。保持开启Liquid Glass时,整个Activity View Controller可能被挤压到右下角,因为它没有锚点和边界。
苹果的文档指出,在iPhone上,完整的布局由系统处理。
在iPad上,启用.sourceView & .sourceRect时显示完美。
如下所示是当前显示效果的截图:
- iOS 18.5显示正确
- iOS 26.5,Liquid Glass关闭时图标重叠
- iOS 26.5,重新开启Liquid Glass时挤压到角落
- iPad 26.5,布局完美
有没有办法让它重新恢复正常状态?
活动项源代码
import Foundation
import UIKit
import LinkPresentation
class CustomActivityItemSource: NSObject, UIActivityItemSource {
let url: URL
init(url: URL) {
self.url = url
}
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return url
}
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
return url
}
@available(iOS 17.0, *)
func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
let metadata = LPLinkMetadata()
metadata.originalURL = url
metadata.url = url
metadata.title = "Share Sheet"
return metadata
}
}
视图控制器的代码
import Foundation
import UIKit
class ShareViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(share))
}
@objc func share(sender: UIBarButtonItem) {
let shareURL = URL(string: "https://www.apple.com")!
let itemSource = CustomActivityItemSource(url: shareURL)
let activityVC = UIActivityViewController(activityItems: [itemSource], applicationActivities: nil)
activityVC.modalPresentationStyle = .popover
if let popoverController = activityVC.popoverPresentationController {
popoverController.sourceView = self.view
popoverController.sourceRect = self.view.bounds
}
present(activityVC, animated: true)
}
}
在得到一些建议后,我尝试了以下修改,结果在iOS 26.5上仍然出现布局问题——视图控制器被挤压到右下角,图标过大。
class ShareViewControllerTwo: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(share))
}
@objc func share(sender: UIBarButtonItem) {
let shareURL = URL(string: "https://www.apple.com")!
let itemSource = CustomActivityItemSource(url: shareURL)
let activityVC = UIActivityViewController(activityItems: [itemSource], applicationActivities: nil)
if let popover = activityVC.popoverPresentationController,
UIDevice.current.userInterfaceIdiom == .pad {
// popover.barButtonItem = sender
popover.sourceItem = sender
}
present(activityVC, animated: true)
}
}
解决方案
经过大量查找,我在SceneDelegate找到了罪魁祸首
我删除了以下这一行:
self.window = UIWindow(frame: UIScreen.main.bounds)
并将其替换为:
let window = UIWindow(windowScene: windowScene)
self.window = window
现在一切都按预期工作;这也是为什么你们中的一些人无法重现该错误的原因,因为你们的SceneDelegate很可能是正确的。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。



