[iphone] UIButton non ascolta l'impostazione della modalità contenuto?


6 Answers

Se hai a che fare con l'immagine di UIButton (al contrario del suo backgroundImage, l'impostazione del contentMode sul UIButton stesso o sul suo imageView non ha alcun effetto (nonostante ciò che dicono altre risposte).

In alternativa, puoi farlo invece:

self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

O ridimensiona la tua immagine di conseguenza.

OPPURE usa semplicemente UIImageView (che rispetta correttamente contentMode) con un UITapGestureRecognizer ad esso collegato o un UIButton trasparente su di esso.

Question

firstButton è un UIButton di tipo Custom. Sto programmaticamente inserendone tre su ogni cella di un tavolo, quindi:

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

Altrove, lo dico a clipToBounds. Quello che ottengo è un ritaglio del quadrato centrale dell'immagine, piuttosto che una rappresentazione in scala dell'aspetto. Ho provato questo in molti modi, inclusa l'impostazione della proprietà mode su firstButton.imageView, che sembra non funzionare.




Credo che qui abbiamo un semplice problema di generazione di interfacce: apparentemente l'IB ignora qualsiasi modifica nella modalità di contenuto DOPO aver impostato la proprietà dell'immagine.

la soluzione è semplice: imposta la modalità contenuto, rimuovi i nomi immagine precedentemente impostati (assicurati di rimuoverlo in tutti gli stati, predefinito, evidenziato ecc.), quindi reinserisci i nomi immagine desiderati in tutti gli stati desiderati - et voilà .




Se qualcuno cerca una risposta che funzioni in iOS 6 e iOS 7 e nello storyboard:

Puoi impostare l'immagine nello storyboard:

E poi:

for(UIView* testId in self.subviews) {
    if([testId isKindOfClass:[UIImageView class]])
        [testId setContentMode:UIViewContentModeScaleAspectFill];
}



La mia risposta è simile a quella di Kuba. Avevo bisogno che la mia immagine venisse programmata.

UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
for(UIView *view in button.subviews) {
    view.contentMode = UIViewContentModeScaleAspectFill;
}



Ho trovato una soluzione per questo. Impostare la proprietà UIButton di UIButton su NO .

  UIButton *b = [[UIButton alloc] initWithFrame:rect];
        [b setImage:image forState:UIControlStateNormal];
        [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
        [b setAdjustsImageWhenHighlighted:NO];

Spero che questo ti aiuti. Sentitevi liberi di commentare qui sotto, seguirò ogni vostra domanda.




Consiglio anche di dare un'occhiata alla proprietà adjustsImageWhenHighlighted UIButton per evitare strane deformazioni dell'immagine, quando si preme il pulsante.




La risposta è usare UIImageView con tutte le impostazioni di Content Mode che preferisci e quindi sovrapporre un pulsante personalizzato su di esso. Scemo che non puoi farlo tutto in un colpo solo, ma sembra che tu non possa.




Related