在iOS 26设备上,活动视图控制器中的服务图标太大

移动开发 2026-07-07

在一个极简的视图控制器中,除了一个用于分享的右上角按钮之外别无他物,当分享表单弹出时,服务图标在iOS 26+设备和模拟器上显得过大且彼此重叠;而iOS 18的布局显示正确。

我说“极简”是因为我已经尝试排除任何可能由实际的视图控制器/我要使用的分享表单本身引起的潜在布局问题。

关闭Liquid Glass引擎并不会对图标大小产生影响。保持开启Liquid Glass时,整个Activity View Controller可能被挤压到右下角,因为它没有锚点和边界。

苹果的文档指出,在iPhone上,完整的布局由系统处理。

在iPad上,启用.sourceView & .sourceRect时显示完美。

如下所示是当前显示效果的截图:

  1. iOS 18.5显示正确
  2. iOS 26.5,Liquid Glass关闭时图标重叠
  3. iOS 26.5,重新开启Liquid Glass时挤压到角落
  4. iPad 26.5,布局完美

iOS 18.5 布局如所愿 iOS 16.5 布局,服务图标过大且重叠 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章