да не, он работает. Каждый раз при вызове функции создает очередной gradientLayer (c bounds равным текущему bounds кнопки) и накладывает его на слой кнопки.
Не совсем понятно для чего там forState. Если надо накладывать только при .normal, а при .selected / .highlighted скрывать надо другую логику делать
(субкласс UIButton, например, и логику там запилить, либо rx)