Construindo a resposta por @split ...
A resposta é fantástica, mas ignora o fato de que o botão pode ter uma imagem personalizada e inserções de borda de título que são definidas de antemão (por exemplo, no storyboard).
Por exemplo, você pode querer que a imagem tenha algum preenchimento nas partes superior e inferior do contêiner, mas ainda assim mova a imagem para o lado direito do botão.
Eu estendi o conceito com este método: -
- (void) moveImageToRightSide {
[self sizeToFit];
CGFloat titleWidth = self.titleLabel.frame.size.width;
CGFloat imageWidth = self.imageView.frame.size.width;
CGFloat gapWidth = self.frame.size.width - titleWidth - imageWidth;
self.titleEdgeInsets = UIEdgeInsetsMake(self.titleEdgeInsets.top,
-imageWidth + self.titleEdgeInsets.left,
self.titleEdgeInsets.bottom,
imageWidth - self.titleEdgeInsets.right);
self.imageEdgeInsets = UIEdgeInsetsMake(self.imageEdgeInsets.top,
titleWidth + self.imageEdgeInsets.left + gapWidth,
self.imageEdgeInsets.bottom,
-titleWidth + self.imageEdgeInsets.right - gapWidth);
}