Need help with Toggle Swap script

Hi
Using the following class to successfully swap sprites on a Toggle object. It works but what I need is to have the Sprite swap happen OnPointerDown instead of OnValueChanged(when the mouse or finger is released).

Can anyone help?

I came across one possible solution but am having a problem implementing

using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(Toggle))]
public class ToggleSpriteSwap : MonoBehaviour
{
    [SerializeField]
    private Image targetImage;e]

    [SerializeField]
    private Sprite onSprite;
    [SerializeField]
    private Sprite offSprite;
    [SerializeField]
    private bool isOn;

    public bool IsOn { get { return isOn; } set { isOn = value; UpdateValue(); } }
    //public event Action<bool> onValueChanged;

    private Toggle toggle;

    // to set initial value and skip onValueChanged notification
    public void Initialize(bool value)
    {
        isOn = value;
        UpdateValue(false);
    }

    // Use this for initialization
    void Start()
    {
        toggle = GetComponent<PointerDownToggle>();
        toggle.transition = Selectable.Transition.None;
         toggle.onValueChanged.AddListener((t) => { OnClick(); });
        
    }

    void OnClick()
    {
        //isOn = !isOn;
        isOn=toggle.isOn;
        UpdateValue();
    }

    private void UpdateValue(bool notifySubscribers = true)
    {
       // if (notifySubscribers && onValueChanged != null)
           // onValueChanged(isOn);

        if (targetImage == null)
            return;

        targetImage.sprite = isOn ? onSprite : offSprite;
    }
}

Ok so almost there. Everything works except my Toggle group isn’t updated. ie members of the group NOT pressed don’t switch to their ‘OFF’ state. I added the 'group.NotifyToggleOn(this) on line 12 and also tried 'base.group.NotifyToggleOn(this); No difference!

Extending Toggle using the following

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class PointerDownToggle : Toggle {
 public override void OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData)
    {
    }
    public override void OnPointerDown (UnityEngine.EventSystems.PointerEventData eventData)
    {
        base.OnPointerClick (eventData);
        group.NotifyToggleOn(this);
    }
}

and then my revised sprite swap class is

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

[RequireComponent(typeof(Toggle))]
public class ToggleSpriteSwap : MonoBehaviour, IPointerDownHandler
{
    [SerializeField]
    private Image targetImage;

    [SerializeField]
    private Sprite onSprite;
    [SerializeField]
    private Sprite offSprite;
    [SerializeField]
    private bool isOn;

    public bool IsOn { get { return isOn; } set { isOn = value; UpdateValue(); } }
 
    private PointerDownToggle toggle;

    public void OnPointerDown(PointerEventData data)
    {
        isOn=toggle.isOn;
        UpdateValue();
        Debug.LogWarning ("1 ASSERT OnPointerDown toggle ==" + toggle);
        Debug.LogWarning ("2 ASSERT OnPointerDown toggle.isOn ==" + toggle.isOn);
    }

    // to set initial value and skip onValueChanged notification
    public void Initialize(bool value)
    {
        isOn = value;
        UpdateValue(false);
    }

    // Use this for initialization
    void Start()
    {
        toggle = GetComponent<PointerDownToggle>();
        toggle.transition = Selectable.Transition.None;
        Debug.LogWarning ("0 ASSERT Start toggle ==" + toggle);
     }
    private void UpdateValue(bool notifySubscribers = true)
    {
        if (targetImage == null)
            return;

        targetImage.sprite = isOn ? onSprite : offSprite;
    }
}

Did you make sure it added your custom Toggle type instead of the regular one ?