iphone ios - UIButton non ascolta l'impostazione della modalità contenuto?




guideline click (13)

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.


Answers

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.


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.


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.


Piuttosto che impostare contentMode sul pulsante stesso, ti consigliamo di impostare contentHorizontalAlignment e contentVerticalAlignment properties e (in modo cruciale) il contentMode per contentMode del pulsante per qualsiasi tipo di aspetto fill o fit. Ecco un esempio:

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

Naturalmente, puoi anche fare altre cose, ad esempio allineare l'immagine del pulsante alla parte superiore del pulsante. Se non hai bisogno di riempire o adattare un aspetto, puoi semplicemente impostare l'allineamento da solo:

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;

In Swift, ti consigliamo di utilizzare:

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

Funziona su tutte le versioni di iOS, incluse le ultime versioni con layout automatico (ad esempio da iOS 4 a iOS 11+).


Dopo un paio di ore di confusione, ecco come ho potuto farlo funzionare su iOS 3.2. Come menzionato dal dusker, usare setBackgroundImage invece di setImage ha fatto il lavoro per me.

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];

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;
}

Swift 3

self.firstButton.imageView?.contentMode = .scaleAspectFill

Se UIButton non sembra ascoltare le impostazioni del vincolo di layout, controlla se le immagini sono più grandi della dimensione del pulsante. Usa sempre le immagini @ 2x e @ 3x per le risoluzioni della retina.


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à .


Invece di setImage, prova setBackgroundImage


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];
}

L'unica soluzione che ha funzionato per me:

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

Non hai accesso allo sfondo imageView, ma c'è una soluzione completamente funzionante:

EDIT : C'è una soluzione ancora migliore di ciò che ho postato in origine. È possibile creare un'immagine UII da qualsiasi colore e chiamare -setBackgroundImage:forState.

Vedi bradley's risposta bradley's , qui: https://.com/a/20303841/1147286

Risposta originale:

Invece di chiamare -setBackgroundImage:forState: crea un nuovo UIImageView e aggiungilo come sottoview del pulsante.

UIImageView *bgImageView = [[UIImageView alloc] initWithImage:img];
bgImageView.contentMode = UIViewContentModeScaleAspectFit;
[bgImageView setFrame:CGRectMake(0, 0, videoButton.frame.size.width, videoButton.frame.size.height)];
bgImageView.tag = 99;
[yourButton addSubview:bgImageView];
[yourButton bringSubviewToFront:yourButton.imageView];
  1. Crea la vista di immagini
  2. Imposta la modalità e il frame del contenuto
  3. Ho anche impostato un tag riconoscibile, in modo che quando lo schermo ruota, posso facilmente trovare la mia immagine personalizzata nelle sottoview del pulsante e ripristinare la sua cornice
  4. Aggiungilo come sottoview al pulsante
  5. Porta in primo piano l'immagine frontale del pulsante in modo che il nostro imageView personalizzato non si sovrapponga a esso

Quando il pulsante deve ruotare basta trovare l'imageView con il suo tag e ripristinare il suo frame:

UIImageView *bgImageView = (UIImageView *)[button viewWithTag:99];
[bgImageView setFrame:CGRectMake(0, 0, newWidth, newHeight)];






iphone uibutton contentmode