UIActivityIndicatorView sobre um UIButton

Você sabia que ao colocar um UIActivityIndicatorView sobre um UIButton , todos os eventos de toque são bloqueados pelo botão giratório?

Se você fizer o mesmo com um UILabel ou UIImageView , todos os eventos são encaminhados para o botão (sua supervisão), como eu (e você) esperamos. Mas com UIActivityIndicatorView este não é o comportamento que você obtém. Todas essas classes são extensões do UIView , então por que funcionam de forma diferente?

A principal diferença é que UIActivityIndicatorView é animado. Quando você tem uma visualização animada, o iOS altera sua propriedade userInteractionEnabled para YES para evitar interações (e interrupções) do usuário com aquela visualização, durante a fase de animação.

Como consertar isso? Basta definir userInteractionEnabled como NO no spinner, para que todos os eventos de toque sejam encaminhados novamente para o superview do spinner (o botão no meu caso) e tudo funcione como eu esperava.

Aqui está o código de exemplo

spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[spinner startAnimating];
[spinner setUserInteractionEnabled:NO]; // setting UserInteractionEnable to NO, any touch events are forwarded to the superview (the button)
spinner
.center = CGPointMake(20, 18);
[self addSubview:spinner];

Erro corrigido. Vamos continuar…