When adding buttons to a sheet, on tvOS the text is blurred in the buttons, making it illegible. Feedback: FB21228496
(used GPT to extract an example from my project for a test project to attach here)
// ButtonBlurTestView.swift
// Icarus
//
// Test view to reproduce blurred button issue on tvOS
//
import SwiftUI
struct ButtonBlurTestView: View {
@State private var showSheet = false
@State private var selectedTags: [Int] = []
@State private var newTagName: String = ""
// Hardcoded test data
private let testTags = [
TestTag(id: 1, label: "Action"),
TestTag(id: 2, label: "Comedy"),
TestTag(id: 3, label: "Drama"),
TestTag(id: 4, label: "Sci-Fi"),
TestTag(id: 5, label: "Thriller")
]
var body: some View {
NavigationStack {
VStack {
Text("Button Blur Test")
.font(.title)
.padding()
Button("Show Test Sheet") {
showSheet = true
}
.buttonStyle(.borderedProminent)
.padding()
Text("Tap the button above to open a sheet with buttons inside a Form.")
.font(.caption)
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
.padding()
}
.navigationTitle("Blur Test")
.sheet(isPresented: $showSheet) {
TestSheetView(
selectedTags: $selectedTags,
newTagName: $newTagName,
testTags: testTags
)
}
}
}
}
struct TestSheetView: View {
@Environment(\.dismiss) private var dismiss
@Binding var selectedTags: [Int]
@Binding var newTagName: String
let testTags: [TestTag]
var body: some View {
NavigationStack {
VStack {
// Header
VStack {
Text("Testing")
.font(.title2)
.bold()
Text("Test TV Show")
.font(.subheadline)
.foregroundColor(.secondary)
}
.padding()
// Form with buttons
Form {
Section(header: Text("Summary")) {
Text("This is a test")
.font(.subheadline)
.foregroundColor(.secondary)
}
Section(header: Text("Tags")) {
tagsSelectionView
}
}
}
.navigationTitle("Add")
#if !os(tvOS)
.navigationBarTitleDisplayMode(.inline)
#endif
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("Cancel") { dismiss() }
}
ToolbarItem(placement: .confirmationAction) {
Button("Add") { dismiss() }
}
}
}
}
private var tagsSelectionView: some View {
VStack(alignment: .leading) {
// Tag pills in a grid
let columns = [GridItem(.adaptive(minimum: 80), spacing: 8)]
LazyVGrid(columns: columns, alignment: .leading, spacing: 8) {
ForEach(testTags, id: \.id) { tag in
TagPill(
tag: tag,
selected: selectedTags.contains(tag.id)
) {
if selectedTags.contains(tag.id) {
selectedTags.removeAll { $0 == tag.id }
} else {
selectedTags.append(tag.id)
}
}
}
}
Divider()
// Add new tag button
HStack {
TextField("New tag name", text: $newTagName)
#if os(tvOS)
.textFieldStyle(PlainTextFieldStyle())
#else
.textFieldStyle(RoundedBorderTextFieldStyle())
#endif
Button("Add") {
// Test action
newTagName = ""
}
.disabled(newTagName.trimmingCharacters(in: .whitespaces).isEmpty)
}
}
}
}
// Tag Pill - matches the structure from original project
private struct TagPill: View {
let tag: TestTag
let selected: Bool
let action: () -> Void
var body: some View {
Button(action: action) {
Text(tag.label)
.font(.callout)
.lineLimit(1)
.padding(.horizontal, 12)
.padding(.vertical, 8)
.background(
Capsule()
.fill(selected ? Color.accentColor : Color.secondary.opacity(0.15))
)
.overlay(
Capsule()
.stroke(selected ? Color.accentColor : Color.secondary.opacity(0.35), lineWidth: 1)
)
.foregroundStyle(selected ? Color.white : Color.primary)
.contentShape(Capsule())
}
.buttonStyle(.plain)
#if os(tvOS)
.focusable(true)
#endif
}
}
struct TestTag {
let id: Int
let label: String
}
#Preview {
ButtonBlurTestView()
}
Posts under tvOS tag
96 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hi
We have an AppleTV app that is used to continuously display information (digital signage). One of our clients reports that their AppleTV returns to the homescreen by morning.
While our recommendation is to setup Mobile Device Management to lock the AppleTV into running only our app, not every client will have the IT knowledge to set this up. So we're trying to figure out possible causes for the app getting closed.
We've not received any crash reports, nor does the device give any indication the app crashed.
The energy saving settings are set to run continuously without sleep.
The client is reporting this happens every night, so it seems unlikely to be caused by tvOS updates.
Are there other things I could rule out to find the cause of this issue? Any ideas are welcome, thanks!
Hi,
We identified massive amounts of leaked memory with the tvOS 26 standard player user interface as soon as chapters (navigation markers) are involved.
Artwork images associated with chapters are not correctly released anymore, leaking memory in chunks of several MiBs.
Over time apps will be terminated by the system due to excessive memory consumption.
The issue was reported to Apple as tvOS 26 regression: Huge memory leaks associated with navigation marker artworks displayed in the tvOS standard user interface, filed under FB21160665.
Hello,
I am currently working on a tvOS project that uses the following pod: GoogleAds-IMA-tvOS-SDK (version 4.16.0).
I have two specific requirements and would like clarification on their feasibility:
Custom Skip Button Timing:
I would like to display a custom skip button with my own skip-timer logic, instead of relying on the skippable time defined in the ad tag. Is it possible to hide the default IMA skip button and replace it with a custom one?
Force-Skipping Ads:
Once my custom skip button becomes available and the user chooses to skip, I need to skip the ad regardless of whether the ad itself is defined as skippable. Is there any way to force-skip an ad on tvOS using the IMA SDK?
If there are any alternative approaches or recommended solutions that could help achieve these requirements, I would greatly appreciate your guidance.
Thank you.
HealthKit is currently not supported on macOS nor tvOS, despite being supported by visionOS. Support for macOS was last asked about[1] here in 2018.
My goal is to display interactive data visualisations over workouts collected in HealthKit on macOS. Will this be possible to do in the near future using HealthKit directly?
If not, can I somehow read the information from an iPhone and display it on the mac?
Cheers,
Rodrigo
[1] https://developer.apple.com/forums/thread/94937
Hi @DTS Engineer
in tvOS 26.2 Beta is still this annoying Shadow Glitch…
I have submitted an Bug-Report, but dont get an Answer… FB20049524
The Animation is not smooth and the Shadow is abruptly „jumping“…
I don’t get any Response from the Apple Engineers. But this GUI Glitch makes the otherwise very high-quality tvOS GUI appear very unprofessional.
Could you please help me? 🤔
Hello, We have Video Stream app. It has HLS VOD Content. We supply 1080p, 4K Contents to users. Users were watching 1080p content before tvOS 26. Users can not watch 1080p content anymore when they update to tvOS 26. We have not changed anything at HLS playlist side and application version. This problem only occurs on Apple TV 4th Gen (A1625) tvOS 26 version. There is no problem with newer Apple TV devices. Would you help to resolve problem? Thanks in advance
Topic:
Media Technologies
SubTopic:
Streaming
Tags:
FairPlay Streaming
Apple TV
tvOS
HTTP Live Streaming
NavigationLinks do not display correctly in tvOS 26. When using a Button, the correct behavior of vertically placing an Image or AsyncImage above one or two Text fields occurs. However, when using NavigationLink the image and text(s) are laid out horizontally. Attempting to fix this using a VStack prevents the text from sliding down as the NavigationLink receives focus. Using the hoverEffect modifier does not help.
Using a Button (correct behavior):
Using a NavigationLink without VStack:
Using a NavigationLink with VStack:
I have an AppleTV app which I released in 2016. I've updated it and released a new version every year without much hassle.
This year, with tvOS 17.2, the layered app icon isn't working right. This is a two-layer image made with PNGs.
When it's selected, it looks right and the layers move correctly:
But when it's not selected, the background layer disappears:
Screenshots are from the simulator but it also happens on the device. It's inconsistent; sometimes it's the front layer that disappears. Occasionally both layers work, but I can't tell why.
I've spent a day trying everything. Very frustrated.
The icon previews correctly in Xcode and in Parallax Viewer.
The image sizes are correct: 400 x 240 for Small, 800 x 480 for Small@2x, 1280 x 768 for Large.
The back layer is a non-transparent PNG.
I tried adding a Large@2x set. Didn't help.
Originally I had a three-layer image with no middle layer PNG. I deleted the empty middle layer, but that didn't help.
All the PNG files are from GnuIMP. Same color space, even.
I was using the filenames tvicon-back-s.png and tvicon-back-s@2x.png. I tried taking out the @ sign in case that was confusing Xcode. (It never has before, but I am flailing here.)
Anybody have any clues? If it's an Apple bug and there's nothing I can do, I'm going to just push the release button and hope it fixes itself someday.
In tvOS26, when using .sheetto wrap a Form, and the Formcontains a Button, the text of the button becomes obscured—as if covered by a haze—when the button is focused.
So I normally use the below as quick reference guide:
https://mar.codes/apple-colors
however, what is the reason that iOS colors are not available on tvOS? Especially the system/grays that are available on iOS.
What does everyone else use for alternatives to these to get close matches between their multi platform apps?
Hi everyone,
After updating my Apple TV HD (model A1625) to tvOS 26, I’ve noticed a significant spike in CPU usage—up to 3× higher than before the update. Go from around 40% to 120%
Model: Apple TV HD (A1625)
tvOS Version: 26 (stable release) and beta version of 26.1,
App downgrade stream due to lack of cpu power
If anyone else is experiencing this, please share your findings or workarounds.
Would love to hear from Apple engineers or other developers if this is a known regression or if there’s a recommended fix.
Thanks!
Hi guys,
after updating to tvOS 26 it is not possible to disable screensaver using AVPlayer.preventsDisplaySleepDuringVideoPlayback.
We are streaming TV programs continuously and when player is in full creen we disable screensaver by setting
preventsDisplaySleepDuringVideoPlayback = true
When leaving player screen and navigating to Home or EPG where player continues to play in the background we set
preventsDisplaySleepDuringVideoPlayback = false
to enable screen saver in which case after set time screensaver activates.
Disabling screensaver appears to be working only when starting the app for the first time, but when making the first transition out of the player and calling preventsDisplaySleepDuringVideoPlayback = false for the first time, then any subsequent change of preventsDisplaySleepDuringVideoPlayback to true has no effect. Result is that player is playing in full screen, but after set period (e.g. 2 minutes) screen saver activates, which is very bad user experience making TV app unusable.
I tried using Xcode 26 and targetting tvOS 17 and higher.
I installed Xcode 16.4 and rebuilt the app, but I see the same problem with screensaver. Xcode 16.4 and tvOS 17 target worked before. It appears to be related to tvOS 26 not to SDK itself.
Is there perhaps a new API to disable screensaver?
Is preventsDisplaySleepDuringVideoPlayback obsolete or could it be intention to disallow developers disabling screensaver? Do we need to notify all users to set screensaver time to higher value or Never if they want to watch TV for all day without touching remote?
Not sure if it is a bug in tvOS 26 or purposely changed behavior.
Does anybody know?
Thanks.
Has any one come across file corruption issues with tvOS 26?
I am tracking an issue where files in my app's NSCachesDirectory are getting corrupted (not deleted) when my app is in the background. The issue is sporadic and very hard to reproduce, but is definitely a new issue with 26.
I can’t get UIScene-based state restoration to work on tvOS as it does on iOS.
UISceneSession.stateRestorationActivity is always nil in UIWindowSceneDelegate.scene(_:willConnectTo:options:) despite UIWindowSceneDelegate.stateRestorationActivity(for:) being called in the previous lifecycle.
The NSUserActivityType is correctly configured in the Info.plist.
Has anyone encountered the same issue or knows how to get this to work?
Sample Project https://github.com/antiraum/tvosSceneStateRestoration
Feedback FB20451479
Here is a minimal code
private func createItem(from movie: Movie, showProgress: Bool, imageType: ImageType) -> TVTopShelfSectionedItem {
let item = TVTopShelfSectionedItem(identifier: movie.id)
// Set title for the item
item.title = movie.title
switch imageType {
case .landscape:
item.imageShape = .hdtv // HDTV shape for landscape/backdrop images
if let backdropUrl = movie.backdropUrl, let url = URL(string: backdropUrl) {
item.setImageURL(url, for: .screenScale2x)
}
case .poster:
item.imageShape = .poster // Poster shape for poster images
if let posterUrl = movie.posterUrl, let url = URL(string: posterUrl) {
item.setImageURL(url, for: .screenScale2x)
}
}
if showProgress {
item.playbackProgress = 0.5
}
return item
}
As you can see the progress bar is pushed to the bottom. There is no padding around it. Am I doing something wrong or this is bug in the framework?
When I display 2/3 of the poster on tvos, after setting it according to the code, some semi-transparent background can be seen in the upper left and right corners of the image when it is in focus. How can I eliminate it?
struct HighPosterView: View {
let media: MediaDetail
@State private var isShowingDetails = false
@Environment(\.isFocused) private var isFocused: Bool
var body: some View {
Button {
isShowingDetails.toggle()
} label: {
HighShelfImageView(imageURL: media.posterURL)
.contentShape(RoundedRectangle(cornerRadius: 24, style: .continuous))
.hoverEffect(.highlight)
Text(media.displayTitle)
.lineLimit(1)
.font(.subheadline)
.frame(maxWidth: 300)
}
.buttonStyle(.borderless)
.animation(.smooth)
}
}
struct HighShelfImageView: View {
let imageURL: URL?
var body: some View {
KFImage.url(imageURL)
.targetCache(ImageCacheManager.shelfCache)
.setProcessor(ImageCacheManager.mediaListShelfProcessor)
.placeholder {
Color.primary.opacity(0.1)
.cornerRadius(Constants.cornerRadius)
}
.cancelOnDisappear(true)
.cacheMemoryOnly(false)
.fade(duration: 0.1)
.cacheOriginalImage(true)
.resizable()
.aspectRatio(2/3, contentMode: .fill)
.clipShape(RoundedRectangle(cornerRadius: Constants.cornerRadius))
}
}
I need to keep the image and text distributed vertically, keep customize corner, with the text pushed aside when the image is in focus.
I'm trying to use the new (in tvOS 26) video streaming service automatic login API from the VideoSubscriberAccount framework:
https://developer.apple.com/documentation/videosubscriberaccount/vsuseraccountmanager/autosignintoken-swift.property
It seems that this API requires an entitlement. This document suggests that the com.apple.smoot.subscriptionservice entitlement is required.
https://developer.apple.com/documentation/videosubscriberaccount/signing-people-in-to-media-apps-automatically
However, it seems more likely that com.apple.developer.video-subscriber-single-sign-on is the correct entitlement.
https://developer.apple.com/documentation/bundleresources/entitlements/com.apple.developer.video-subscriber-single-sign-on
Which is the correct entitlement and how do I obtain it?
I don't want to fully comply with the video partner program.
https://developer.apple.com/programs/video-partner/
I just want to use this one new automatic login feature.
Hi everyone! I'm building a tvOS 18.5 app using SwiftUI in Xcode 16.4, and I'm having trouble reliably detecting button clicks from the 2nd generation Siri Remote.
.onMoveCommand(perform: handleMoveCommand)
func handleMoveCommand(_ direction: MoveCommandDirection) {
switch direction {
case .right: nextQuote()
case .left: previousQuote()
default: break
}
}
Swiping left or right on the remote's touch surface works as expected, the callback fires every time.
However, when I press the physical left/right buttons (outside the touch surface), the input is unreliable. Sometimes it registers, other times I need to press multiple times or nothing happens at all.
I’ve confirmed the view is .focusable(true) and bound with @FocusState.
Is this a known limitation or bug with .onMoveCommand on recent tvOS versions? Or is there a more robust way to handle physical Siri Remote button presses?
Now I’m testing in-app purchase for my app but I can’t find how to set up my snadbox account in tvOS.
Acoording to Apple support team, the following menu item should be available in the settings;
Settings > Users and Accounts > Sandbox Account
But it’s not the case for me even I activated develope mode in tvOS already.
Can anyone explain how to set up sandbox account in tvOS or how to activate the menu above?
Thanks in advance.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
tvOS
In-App Purchase
StoreKit