How do I force tick for unrendered UMG widgets?

I have a vertical box that is inside a canvas panel.

The vertical box contains a bunch of widgets. Sometimes they get clipped by the canvas panel and are not shown.

It seems that the Tick event is not called on widgets that are clipped by the canvas panel.

How can I make Tick get called?

This may help you:

I’m also aware of a tick box in the widget details panel named something along the lines of “Force tick when off screen”.

I’m kind late to the party, but for those looking for an answer (c++), here it is.

First off delete your tick function as we won’t be needing that, my solution involves creating a custom tick.

Step 2. Have a ticker delegate handle in your widget’s class

FTSTicker::FDelegateHandle TickDelegateHandle;

Step 3. Make a custom tick function
.h :

bool CustomTick(float DeltaTime);

.cpp

bool UYourWidgetClass::CustomTick(float DeltaTime)
{
	// Do whatever you gotta do here
	return true;
}

Step 4. Bind you custom tick to the core ticker
NOTE : if you make CustomTick a UFUNCTION() and bind it using BindUObject, you’ll end up with the same problem you initially had, as the engine will realize the tick function you’re tryna bind is owned by a widget.
.cpp :

void UYourWidgetClass::NativeConstruct()
{
        Super::NativeConstruct();
        FTickerDelegate Delegate;
        Delegate.BindLambda([this](float DeltaTime){ return CustomTick(DeltaTime); });
        TickDelegateHandle = FTSTicker::GetCoreTicker().AddTicker(Delegate);
}

Step 5. Unbind the tick function once you’re done ticking
.cpp :

void UYourWidgetClass::NativeDestruct()
{
	Super::NativeDestruct();
        FTSTicker::GetCoreTicker().RemoveTicker(TickDelegateHandle);
}

There you go bud.

NOTE : For older versions of the engine (like 4.1 and before), you might have to use FTicker instead of FTSTicker, as FTSTicker is a thread-safe version they made later on. dw thought they’re used the exact same way.