SwiftUI Button with Image view label has smaller hit target

[Also submitted as FB20213961]

SwiftUI Button with a label: closure containing only an Image view has a smaller tap target than buttons created with a Label or the convenience initializer. The hit area shrinks to the image bounds instead of preserving the standard minimum tappable size.

SCREEN RECORDING

On a physical device, the difference is obvious—it’s easy to miss the button. Sometimes it even shows the button-tapped bounce animation but doesn’t trigger the action.

SYSTEM INFO

  • Xcode Version 26.0 (17A321)
  • macOS 15.6.1 (24G90)
  • iOS 26.0 (23A340)

SAMPLE CODE

The following snippet shows the difference in hit targets between the convenience initializer, a Label, and an Image (the latter two in a label: closure).

// ✅ Hit target is entire button
Button("Button 1", systemImage: "1.square.fill") {
    print("Button 1 tapped")
}

// ✅ Hit target is entire button
Button {
    print("Button 2 tapped")
} label: {
    Label("Button 2", systemImage: "2.square.fill")
}

// ❌ Hit target is smaller than button
Button {
    print("Button 3 tapped")
} label: {
    Image(systemName: "3.square.fill")
}

Have faced this issue as well & noticed that Apple system apps don't seem to face this issue, so unsure what methods they are using.

Thanks for the tip to avoid this. Just tested it with iPadOS 26.6 beta 1 and it still is an issue. 😕

Thanks for the post. When you use a custom label: closure containing only an Image, SwiftUI sizes the button exactly to the intrinsic bounds of that image. If the image is small, like a standard SF Symbol, the minimum tap target size of 44x44.

You can explicitly define a minimum frame for the image. However, when you expand the frame of an image, the empty space around it might not register taps. To fix this, apply .contentShape(Rectangle()) to tell SwiftUI that the entire bounding box should be interactive.

In place code using your code above without using Xcode.

Button {
    print("Button 3 tapped")
} label: {
    Image(systemName: "3.square.fill")
	  .frame(minWidth: 44, minHeight: 44) 
    .contentShape(Rectangle())         
}

Albert
  Worldwide Developer Relations.

Thanks, @DTS Engineer. I haven’t tried that exact workaround, but I expect it works. Defining the label differently also avoids the issue with less code, so there are multiple workarounds.

The bigger issue is the tap feedback. Tapping outside the SF Symbol but inside the visible button can show the normal bounce animation without triggering the action. If the action doesn’t run, the button shouldn’t look like it accepted the tap.

This feels related to another issue I reported, where a disabled button still bounces like an active button:

Thank you for bringing this to our attention. I appreciate you providing this new issue as well. I apologize for not realizing that you were not seeking a workaround just informing the team about the bug reported. I would recommend you to keep an eye on your FB number for updates.

You can see the status of your feedback in Feedback Assistant. There, you can track if the report is still being investigated, has a potential identifiable fix, or has been resolved in another way. The status appears beside the label "Resolution." We're unable to share any updates on specific reports on the forums.

For more details on when you'll see updates to your report, please see What to expect after submission.

Albert
  Worldwide Developer Relations.

Hello @Bikrrr,

Just to check, could you please verify if your linked issue (FB19313064) still appears in iOS 26.5? Feel free to post your results in your other thread as well.

Thanks for your patience,

Richard Yeh  Developer Technical Support

SwiftUI Button with Image view label has smaller hit target
 
 
Q