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…