Come regolare l'immagine di un UIButton?


158

Come posso regolare la dimensione dell'immagine del pulsante UIB? Sto impostando l'immagine in questo modo:

[myLikesButton setImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

Tuttavia, questo riempie l'immagine fino al pulsante completo, come posso ridurre l'immagine?


6
Hai provato a rimpicciolire l'immagine (LOL)?
CodaFi,

1
@CodaFi ha ragione, dovresti generalmente fornire risorse della giusta dimensione in quanto riduce qualsiasi lavoro per la CPU, utilizza meno memoria e molto probabilmente avrà un aspetto migliore poiché non introduci potenzialmente alcun artefatto di ridimensionamento ...
Paul.s

Inoltre puoi rendere il pulsante delle dimensioni dell'immagine (o viceversa). Perché hai un pulsante grande ... con una piccola immagine al suo interno. Basta aggiungere l'immagine che desideri, ecco a cosa servono i pulsanti personalizzati o puoi spiegare la logica che si desidera implementare affinché gli altri abbiano un'idea chiara.
Abhishek Singh,

Risposte:


243

Se capisco correttamente cosa stai cercando di fare, devi giocare con l'inserimento del bordo dell'immagine dei pulsanti. Qualcosa di simile a:

myLikesButton.imageEdgeInsets = UIEdgeInsets(top, left, bottom, right)

96

La risposta di Tim è corretta, tuttavia volevo aggiungere un altro suggerimento, perché nel mio caso c'era una soluzione più semplice del tutto.

Stavo cercando di impostare gli UIButtoninserti di immagini perché non mi rendevo conto che avrei potuto impostare la modalità di contenuto sui pulsanti UIImageView, il che avrebbe impedito la necessità di utilizzare UIEdgeInsets e valori codificati del tutto. Accedi semplicemente alla visualizzazione immagine sottostante sul pulsante e imposta la modalità contenuto:

myButton.imageView.contentMode = UIViewContentModeScaleAspectFit;

Vedi UIButton non ascolta le impostazioni della modalità contenuto?

Swift 3

myButton.imageView?.contentMode = .scaleAspectFit

1
come fare lo stesso per backgroundImage?
Sergey Sahakyan,

myButton.backgroundImageView? .contentMode = .scaleAspectFit
Andrea.Ferrando il

@ Andrea.Ferrando button.backgroundImageView.contentModenon funziona
Seong Lee,

Risparmia un po 'di tempo e assicurati di impostare l'immagine non l'immagine di sfondo! @SeongLee è corretto non è possibile manipolare l'immagine di sfondo con contentMode o EdgeInserts
redPanda

42

Swift 3:

button.setImage(UIImage(named: "checkmark_white"), for: .normal)
button.contentVerticalAlignment = .fill
button.contentHorizontalAlignment = .fill
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)

6
Questo ha funzionato magnificamente per me. Ho creato un'icona PDF in Inkscape e le contentVerticalAlignment/contentHorizontalAlignmentopzioni mi hanno permesso di ridimensionarlo come speravo. grazie per aver postato questo.
Adrian,

2
impostazione contentHorizontalAlignmente ha contentVerticalAlignmentfatto il trucco
Tom Knapen

1
Questa soluzione funziona benissimo quando si utilizzano risorse PDF per le icone. Grazie!
Eneko Alonso,

38

Puoi anche farlo dal builder inteface in questo modo.

inserisci qui la descrizione dell'immagine

Penso che sia utile


26

Se la tua immagine è troppo grande (e non puoi / non vuoi solo ridurla), una combinazione delle prime due risposte funziona alla grande.

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 5.0)

A meno che non si ottengano le inserzioni di immagine giuste, l'immagine verrà inclinata senza modificare la contentMode.


23

puoi usare la imageEdgeInsetsproprietà I margini dell'inserzione o dell'outset per il rettangolo attorno all'immagine del pulsante.

 [self.btn setImageEdgeInsets:UIEdgeInsetsMake(6, 6, 6, 6)];

Un valore positivo si restringe, o inserisce, quel bordo - in movimento. Un valore negativo si espande, o supera, quel bordo.


17

Ecco l'altra soluzione per ridimensionare imageView di UIButton.

button.imageView?.layer.transform = CATransform3DMakeScale(0.8, 0.8, 0.8)

Mi hai salvato la giornata. Volevo solo ridimensionare la mia immagine all'interno di un pulsante. Nessun inserto, niente, grazie!
Pedro Antonio,

15

Ecco la versione Swift:

myButton.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

8

Swift 4

Dovresti usare queste due righe di codice, in questo ordine specifico. Tutto ciò che serve è cambiare il valore superiore e inferiore delle inserzioni dei bordi.

addButton.imageView?.contentMode = .scaleAspectFit
addButton.imageEdgeInsets = UIEdgeInsetsMake(10.0, 0.0, 10.0, 0.0)

Ciò ha causato un EXC_BAD_ACCESSerrore quando chiamato da override func layoutSubviews().
Andrew Kirna,

7

Con l'aiuto della risposta di Tim C , sono stato in grado di creare un'estensione UIButtonutilizzando Swift che consente di specificare la cornice immagine utilizzando la .setImage()funzione con un frameparametro aggiuntivo

extension UIButton{

    func setImage(image: UIImage?, inFrame frame: CGRect?, forState state: UIControlState){
        self.setImage(image, forState: state)

        if let frame = frame{
            self.imageEdgeInsets = UIEdgeInsets(
                top: frame.minY - self.frame.minY,
                left: frame.minX - self.frame.minX,
                bottom: self.frame.maxY - frame.maxY,
                right: self.frame.maxX - frame.maxX
            )
        }
    }

}

Usando questo, se si desidera impostare il frame di un UIButtona CGRectMake(0, 0, 64, 64)e impostarne l'immagine myImagecon un frame di CGRectMake(8, 8, 48, 48), è possibile utilizzare

let button: UIButton = UIButton(frame: CGRectMake(0, 0, 64, 64))
button.setImage(
    myImage,
    inFrame: CGRectMake(8, 8, 48, 48),
    forState: UIControlState.Normal
)

4
Dovresti if letinvece verificare se frameè nile quindi forzare lo scartamento di un milione di volte .
fpg1503,

7

Quando si cambia la dimensione dell'icona con UIEdgeInsetsMake(top, left, bottom, right) , tenere presente le dimensioni del pulsante e la capacità di UIEdgeInsetsMake di funzionare con valori negativi come se fossero positivi.

Esempio: due pulsanti con altezza 100 e aspetto 1: 1.

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)

inserisci qui la descrizione dell'immagine

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(45, 0, 45, 0)

inserisci qui la descrizione dell'immagine

left.imageEdgeInsets = UIEdgeInsetsMake(40, 0, 40, 0)
right.imageEdgeInsets = UIEdgeInsetsMake(60, 0, 60, 0)

inserisci qui la descrizione dell'immagine

Gli esempi 1 e 3 sono identici poiché ABS (100 - (40 + 40)) = ABS (100 - (60 + 60))


2

Swift 3

Ho impostato la larghezza e l'altezza di myButton su 40 e la mia imbottitura di EdgeInsetsMake è 15 su tutti i lati. Suggerisco di aggiungere un colore di sfondo al pulsante per vedere l'imbottitura effettiva.

myButton.backgroundColor = UIColor.gray // sample color to check padding
myButton.imageView?.contentMode = .scaleAspectFit
myButton.imageEdgeInsets = UIEdgeInsetsMake(15, 15, 15, 15)

2

Un approccio consiste nel ridimensionare il UIImage in codice come il seguente. Nota: questo codice viene ridimensionato solo in base all'altezza, ma è possibile regolare facilmente anche la funzione in base alla larghezza.

let targetHeight = CGFloat(28)
let newImage = resizeImage(image: UIImage(named: "Image.png")!, targetHeight: targetHeight)
button.setImage(newImage, for: .normal)

fileprivate func resizeImage(image: UIImage, targetHeight: CGFloat) -> UIImage {
    // Get current image size
    let size = image.size

    // Compute scaled, new size
    let heightRatio = targetHeight / size.height
    let newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
    let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

    // Create new image
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
    image.draw(in: rect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    // Return new image
    return newImage!
}

2

Aggiornato per Swift> 5

imposta la dimensione:

button.frame = CGRect(x: 0, y: 0, width: 44, height: 44)

impostare i margini:

button.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

1

Aggiornato per Swift 3

yourButtonName.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10)

-6

penso che la dimensione dell'immagine sia uguale alla dimensione del pulsante, quindi metti l'immagine sullo sfondo del pulsante come:

[myLikesButton setBackgroundImage:[UIImage imageNamed:@"icon-heart.png"] forState:UIControlStateNormal];

hai lo stesso formato di immagine e pulsante. Spero di capire il mio punto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.