You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决iOS优先应用在macOS(Designed for iPad模式)下图片选择异常问题

在macOS“为iPad设计”模式下的图片选择异常问题

问题描述

设计规范的iPad应用通常可在Mac上运行,但在macOS 14(注:原描述为macOS 26,应为笔误)的“为iPad设计”模式下运行旧应用时,发现所有原生图片选择器(PhotosPicker、PHPickerViewController、UIImagePickerController)均存在异常:图片几乎无法选中,多次点击才可能成功。但这些选择器在iPhone和iPad上运行完全正常。

以下是可复现问题的最简现代代码:

import SwiftUI
import PhotosUI

struct ContentView: View {
    @State private var selectedItem: PhotosPickerItem?
    @State private var selectedImage: UIImage?
    
    var body: some View {
        VStack {
            if let selectedImage {
                Image(uiImage: selectedImage)
                    .resizable()
                    .scaledToFit()
            }
            
            // 基于PhotosPicker的现代相册选择器,非PHPickerViewController/UIImagePickerController实现
            PhotosPicker(
                selection: $selectedItem,
                matching: .images
            ) {
                Label("Select Photo", systemImage: "photo")
            }
            .onChange(of: selectedItem) { newItem in
                Task {
                    if let data = try? await newItem?.loadTransferable(type: Data.self),
                       let uiImage = UIImage(data: data) {
                        selectedImage = uiImage
                    }
                }
            }
        }
    }
}

可行解决方案与建议

  • 针对macOS单独适配原生控件:通过条件编译为macOS平台实现基于NSOpenPanel的图片选择逻辑,绕开iPad模式下的选择器bug:
// 在SwiftUI视图中区分平台实现
#if os(macOS)
Button("Select Photo") {
    let panel = NSOpenPanel()
    panel.allowedContentTypes = [.image]
    panel.allowsMultipleSelection = false
    if panel.runModal() == .OK, let url = panel.urls.first {
        if let data = try? Data(contentsOf: url), let uiImage = UIImage(data: data) {
            selectedImage = uiImage
        }
    }
}
#else
// 保留原iOS/iPadOS的PhotosPicker实现
PhotosPicker(
    selection: $selectedItem,
    matching: .images
) {
    Label("Select Photo", systemImage: "photo")
}
.onChange(of: selectedItem) { newItem in
    Task {
        if let data = try? await newItem?.loadTransferable(type: Data.self),
           let uiImage = UIImage(data: data) {
            selectedImage = uiImage
        }
    }
}
#endif
  • 扩大选择器交互区域:为PhotosPicker的Label添加更大的点击范围,提升点击响应概率:
PhotosPicker(
    selection: $selectedItem,
    matching: .images
) {
    Label("Select Photo", systemImage: "photo")
        .frame(minWidth: 120, minHeight: 44)
        .contentShape(Rectangle())
}
  • 等待官方修复:已向Apple提交反馈,遇到相同问题的开发者可在相关论坛补充复现信息,推动问题解决。

内容的提问来源于stack exchange,提问作者laconicman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:53:13