`onTapGesture` not triggered on `Map` views

When building with iOS 26 SDK beta 5 (23A5308f), onTapGesture is no longer being triggered on Map views. This appears to be a regression in beta 5 specifically, as this issue was not present in beta 4.

How to reproduce

Code

The following code demonstrates the issue, as seen in the videos below.

import MapKit
import SwiftUI

struct ContentView: View {
  @State private var location = CGPoint.zero

  var body: some View {
    Map()
      .onTapGesture { location in
        self.location = location
      }
      .safeAreaInset(edge: .bottom) {
        VStack(alignment: .center) {
          Text("iOS \(UIDevice.current.systemVersion)")
            .font(.largeTitle)

          Text("Tapped Location")
          Text("\(location.x), \(location.y)")
        }
        .frame(maxWidth: .infinity, alignment: .center)
        .background(.background)
      }
  }
}

Demo

The gifs below show the behavior in iOS 18.5 (in which the tap gestures are recognized and tapped coordinate is displayed in the safe area inset) and iOS 26 beta 5 (in which the tap gestures have no effect):

iOS 18iOS 26

Next steps?

Is there a recommended workaround for this issue?

Still not fixed in RC, will proceed with the workaround for initial iOS 26 support release.

This issue is noted in the iOS 26 Release Notes (search for FB19394663), so yes, you'll need to keep using the workarounds in this thread for now.

— Ed Ford,  DTS Engineer

For those having to deal with that bug and in need to get location for the tap, I've used the answer here https://stackoverflow.com/questions/56513942/how-to-detect-a-tap-gesture-location-in-swiftui with a slight modification :

import SwiftUI

struct ClickGesture: Gesture {
    let count: Int
    let coordinateSpace: CoordinateSpace
    
    typealias Value = SimultaneousGesture<TapGesture, DragGesture>.Value
    
    init(count: Int = 1, coordinateSpace: CoordinateSpace = .local) {
        precondition(count > 0, "Count must be greater than or equal to 1.")
        self.count = count
        self.coordinateSpace = coordinateSpace
    }
    
    var body: SimultaneousGesture<TapGesture, DragGesture> {
        SimultaneousGesture(
            TapGesture(count: count),
            DragGesture(minimumDistance: 0, coordinateSpace: coordinateSpace)
        )
    }
    
    func onEnded(perform action: @escaping (CGPoint) -> Void) -> _EndedGesture<ClickGesture> {
        self.onEnded { (value: Value) -> Void in
            guard value.first != nil else { return }
            guard let location = value.second?.startLocation else { return }
            guard let endLocation = value.second?.location else { return }
            guard ((location.x-1)...(location.x+1)).contains(endLocation.x),
                  ((location.y-1)...(location.y+1)).contains(endLocation.y) else {
                return
            }
            action(location)
        }
    }
}

extension View {
    func onClickGesture(
        count: Int,
        coordinateSpace: CoordinateSpace = .local,
        perform action: @escaping (CGPoint) -> Void
    ) -> some View {
        simultaneousGesture(ClickGesture(count: count, coordinateSpace: coordinateSpace)
            .onEnded(perform: action)
        )
    }
    
    func onClickGesture(
        count: Int,
        perform action: @escaping (CGPoint) -> Void
    ) -> some View {
        onClickGesture(count: count, coordinateSpace: .local, perform: action)
    }
    
    func onClickGesture(
        perform action: @escaping (CGPoint) -> Void
    ) -> some View {
        onClickGesture(count: 1, coordinateSpace: .local, perform: action)
    }
}

An update regarding the state of this issue as of iOS 26.1 beta 1

Using 26.1 beta 1 (23B5044k), I tested this issue using the sample code provided with the original post, and there's a partial fix in this build of iOS 26.1, but there's a noticeable performance issue that folks will likely want to keep in mind.

There's a significant regression between the responsive UI experience that was present in iOS 18.6 and the high-latency UI experience now present in iOS 26.1. I'll try to summarize how the behavior varies across OS versions:

  • iOS 18.6: onTapGesture triggers callback nearly instantly
  • iOS 26.0: onTapGesture fails to trigger callback at all
  • iOS 26.1: onTapGesture eventually triggers callback, but there's a significant delay that causes the app to feel unresponsive

Demo

The attached gif attempts to show the delay, but it feels much more apparent when you're using an app yourself and you sense the delay between when you personally tap on the screen and when the screen updates. The gif shows the follow:

  1. Using onTapGesture in iOS 18.6: ~100ms between when the user taps and when the view updates to show the GPS coordinates of the tapped location

  2. Using simultaneousGesture in iOS 26.1: ~100ms between when the user taps and when the view updates to show the GPS coordinates of the tapped location. (simultaneousGesture is the workaround demonstrated in https://developer.apple.com/forums/thread/795909?answerId=855111022#855111022.)

  3. Using onTapGesture in iOS 26.1: ~400ms between when the user taps and when the view updates to show the GPS coordinates of the tapped location

Unresponsive UI

To me, the latency of using onTapGesture in iOS 26.1 beta 1 (simulator version 23B5044k) is too severe.

Knowing that Apple cares about apps feeling responsive to touch, I don't think that Apple would accept this latency in Apple's first-party apps.

Along those same lines, I plan to stick with the simultaneousGesture workaround until onTapGesture is as responsive in iOS 26.x as it was in iOS 18.6.

I hope this perspective is helpful.

&#96;onTapGesture&#96; not triggered on &#96;Map&#96; views
 
 
Q