Come controllare l'interlinea in UILabel


274

È possibile ridurre il divario tra il testo, se inserito in più righe in un UILabel? Possiamo impostare il frame, la dimensione del carattere e il numero di righe. Voglio ridurre il divario tra le due linee in quell'etichetta.



2
Posso suggerire di accettare una delle risposte corrette per iOS 6.0 e versioni successive? La risposta attualmente accettata non è aggiornata.
Mark Amery,

Per ogni riga utilizzare un nuovo UILabel, quindi incorporare tutte le etichette in a StackView. Infine regola il spacingdi StackView. Ricorda di impilarli verticalmente.
Miele,

Fare riferimento al seguente collegamento per la soluzione in Swift 2. stackoverflow.com/a/39158698/6602495
Sneha,

Fare riferimento a stackoverflow.com/a/44325650/342794 per la modifica dello storyboard e altri dettagli.
martedì

Risposte:


262

Ho pensato di aggiungere qualcosa di nuovo a questa risposta, quindi non mi sento così male ... Ecco una risposta rapida :

import Cocoa

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 40

let attrString = NSMutableAttributedString(string: "Swift Answer")
attrString.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

var tableViewCell = NSTableCellView()
tableViewCell.textField.attributedStringValue = attrString

"Risposta breve: non puoi. Per cambiare la spaziatura tra le righe di testo, dovrai sottoclassare UILabel e rotolare il tuo drawTextInRect o creare più etichette."

Vedi: Imposta la spaziatura di linea UILabel


Questa è una risposta molto vecchia, e altri hanno già aggiunto il modo nuovo e migliore per gestirlo. Si prega di consultare le risposte aggiornate fornite di seguito.


23
Da iOS 6.0, puoi controllarlo tramite NSAttributedString(disponibile anche nelle proprietà di UILable nel generatore di interfacce di Xcode).
ɾɾuǝʞ

13
È interessante notare che, il più vicino che posso dire, è possibile aggiungere la spaziatura tra le righe in più, ma non ridurlo attraverso il NSParagraphStylequando si utilizza un NSAttributedString. (Potrei aver bisogno di fare ulteriori test delle altre proprietà modificabili, ma la lineSpacingproprietà ti consente solo di aumentarla.)
livingtech

vedi la mia risposta per vedere come usare NSAttributedString
d.ennis

2
@livingtech È esasperante e credo che tu abbia ragione. Hai trovato qualche soluzione?
Dom Vinyard,

7
Giusto per chiarire qualcosa in questo thread. Se vuoi ridurre la spaziatura tra le righe imposta l'altezza della linea su 1.0, quindi impostaLineHeightMultiple su un valore inferiore <1.0, ad esempio: [paragraphStyle setLineHeightMultiple: 0.8] o paragraphStyle.lineHeightMultiple = 0.8
virsunen

401

In Xcode 6 puoi farlo nello storyboard:

inserisci qui la descrizione dell'immagine


1
Approfitta dei vantaggi dello storyboard!
Allen,

22
@PaperThick ha lo stesso problema in 6.1.1. "Harlem shake" per pochi minuti. Non sa come ripararlo :) Xcode Shaking
Anton Gaenko,

8
C'è un modo per impostare caratteri personalizzati in questo modo? Non riesco a cambiare questa helvetica neue con nessun altro font.
Marcos Curvello,

2
Se abiliti "Attribuito" e quindi apri il file come codice sorgente, puoi modificare manualmente "lineHeightMultiple" e quindi bypassare il bug di Harlem Shake
ED-209

2
@azdev per chiunque lo stia ancora guardando, sto per ottenere più frullati in Xcode 7.3, ma penso che questa sia la prima versione in cui non è stato un problema
LulzCow

103

A partire da iOS 6 è possibile impostare una stringa attribuita a UILabel. Controlla quanto segue:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:label.text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.text.length)];

label.attributedText = attributedString;

1
La attributedStringdeve essere un NSMutableAttributedString(non NSAttributedString)
Mike S

14
Il codice della prima riga dovrebbe essereNSMutableAttributedString *attributedString = [NSMutableAttributedString alloc]initWithString:@"sample text"];
Allen

La lineSpacingproprietà di NSMutableParagraphStylenon è mai negativa, quindi l'altezza della linea non può essere ridotta con questo approccio. Per rispondere alla domanda, devi usare un'altra proprietà, vedi la risposta di @ d.ennis.
Theo,

81

Le soluzioni qui indicate non hanno funzionato per me. Ho trovato un modo leggermente diverso di farlo con iOS 6 NSAttributeString:

myLabel.numberOfLines = 0; 
NSString* string = @"String with line one. \n Line two. \n Line three.";
NSMutableParagraphStyle *style  = [[NSMutableParagraphStyle alloc] init];
style.minimumLineHeight = 30.f;
style.maximumLineHeight = 30.f;
NSDictionary *attributtes = @{NSParagraphStyleAttributeName : style,};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:string
                                                         attributes:attributtes];   
[myLabel sizeToFit];

1
L'altezza della linea dipende dalla dimensione del carattere. L'interlinea è proprio questo, l'interlinea. Puoi far funzionare le cose semplicemente impostando l'altezza della linea min / max, ma questo è solo perché le dimensioni del carattere corrente che stai utilizzando non sono maggiori dei limiti dell'altezza della linea. Secondo la documentazione: "... glifi e la grafica che superano questa altezza si sovrapporranno alle linee vicine ... Sebbene questo limite si applichi alla linea stessa, l'interlinea aggiunge spazio extra tra le linee adiacenti."
Ari Braginsky,

+1, se si desidera ridurre la spaziatura tra le linee, questo è ciò che si desidera fare. La spaziatura della linea reale è molto probabilmente 0 per impostazione predefinita, ecco perché le persone segnalano che puoi solo aumentarla. Il problema con la spaziatura troppo grande deriva dall'altezza della linea essendo troppo grande, ecco perché questo farà eseguire il lavoro il 99% delle volte.
lawicko,

1
Questa è l'unica risposta che ho trovato che utilizza il valore dell'altezza della linea effettiva (anziché un rapporto) comune per progettare applicazioni come Photoshop, Sketch, CSS, ecc.
Albert Bori,

35

Ho realizzato questa semplice estensione che funziona molto bene per me:

extension UILabel {
    func setLineHeight(lineHeight: CGFloat) {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 1.0
        paragraphStyle.lineHeightMultiple = lineHeight
        paragraphStyle.alignment = self.textAlignment

        let attrString = NSMutableAttributedString()
        if (self.attributedText != nil) {
            attrString.append( self.attributedText!)
        } else {
            attrString.append( NSMutableAttributedString(string: self.text!))
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
        }
        attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
        self.attributedText = attrString
    }
}

Copia questo in un file, quindi puoi usarlo in questo modo

myLabel.setLineHeight(0.7)

ricordati di farlo mentre usi Storyboard anche per questa etichetta, quindi assicurati di impostare le linee della tua etichetta su 0
Honey

Perché non devi semplicemente impostare direttamente lineSpacinge dimenticare l'impostazione lineHeightMultiple?
Miele

Perché la chiave per ridurre l'altezza della linea è 'lineHeightMultiple', nessuna lineaSpacing
Agustin Meriles

dire che vuoi che la tua altezza della linea sia 1.4, perché non puoi semplicemente scrivere .lineSpacing = 1.4e dimenticare tutto .lineHeightMultiple...
Miele

Hah! Ci ho provato e non ho funzionato, ma mi chiedo perché non vedo qui altre risposte che non usano il tuo meccanismo, intendo che impostano direttamente la linea di spaziatura. Vedi la risposta accettata ...
Honey

33

Da Interface Builder (Storyboard / XIB):

inserisci qui la descrizione dell'immagine

livello di programmazione:

SWift 4

Utilizzando l'estensione dell'etichetta

extension UILabel {

    // Pass value for any one of both parameters and see result
    func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {

        guard let labelText = self.text else { return }

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple

        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }

        // Line spacing attribute
        attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

        self.attributedText = attributedString
    }
}

Ora chiama la funzione di estensione

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"

// Pass value for any one argument - lineSpacing or lineHeightMultiple
label.setLineSpacing(lineSpacing: 2.0) .  // try values 1.0 to 5.0

// or try lineHeightMultiple
//label.setLineSpacing(lineHeightMultiple = 2.0) // try values 0.5 to 2.0

O usando l'istanza dell'etichetta (basta copiare ed eseguire questo codice per vedere il risultato)

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40

// Line spacing attribute
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))

// Character spacing attribute
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))

label.attributedText = attrString

Swift 3

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
attrString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
label.attributedText = attrString

2
Aggiungi la riga "paragraphStyle.alignment = self.textAlignment" per mantenere l'allineamento originale. Altrimenti, il testo verrà allineato a sinistra.
Nithin Michael,

Per chiunque perdesse i puntini di sospensione su testi di grandi dimensioni, utilizzare quindi: paragraphStyle.lineBreakMode = .byTruncatingTail
christostsang



11

In Swift e come funzione, ispirato a DarkDust

// Usage: setTextWithLineSpacing(myEpicUILabel,text:"Hello",lineSpacing:20)
func setTextWithLineSpacing(label:UILabel,text:String,lineSpacing:CGFloat)
{
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = lineSpacing

    let attrString = NSMutableAttributedString(string: text)
    attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

    label.attributedText = attrString
}

7

Secondo la risposta di @Mike, ridurre il lineHeightMultiplepunto chiave. Esempio sotto, funziona bene per me:

    NSString* text = label.text;
    CGFloat textWidth = [text sizeWithAttributes:@{NSFontAttributeName: label.font}].width;
    if (textWidth > label.frame.size.width) {
        NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
        paragraph.alignment = NSTextAlignmentCenter;
        paragraph.lineSpacing = 1.0f;
        paragraph.lineHeightMultiple = 0.75;     // Reduce this value !!!
        NSMutableAttributedString* attrText = [[NSMutableAttributedString alloc] initWithString:text];
        [attrText addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, text.length)];
        label.attributedText = attrText;
    }

6

SWIFT 3 utile estensione per impostare più facilmente lo spazio tra le linee :)

extension UILabel
{
    func setLineHeight(lineHeight: CGFloat)
    {
        let text = self.text
        if let text = text 
        {

            let attributeString = NSMutableAttributedString(string: text)
            let style = NSMutableParagraphStyle()

           style.lineSpacing = lineHeight
           attributeString.addAttribute(NSParagraphStyleAttributeName,
                                        value: style,
                                        range: NSMakeRange(0, text.characters.count))

           self.attributedText = attributeString
        }
    }
}

5

Ho trovato un modo in cui puoi impostare l' altezza della linea reale (non un fattore) e rende anche live in Interface Builder . Segui le istruzioni qui sotto. Il codice è scritto in Swift 4 .


Passaggio 1: creare un file denominato DesignableLabel.swifte inserire il seguente codice:

import UIKit

@IBDesignable
class DesignableLabel: UILabel {
    @IBInspectable var lineHeight: CGFloat = 20 {
        didSet {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.minimumLineHeight = lineHeight
            paragraphStyle.maximumLineHeight = lineHeight
            paragraphStyle.alignment = self.textAlignment

            let attrString = NSMutableAttributedString(string: text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: font, range: NSRange(location: 0, length: attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attrString.length))
            attributedText = attrString
        }
    }
}

Passaggio 2: posiziona a UILabelin uno Storyboard / XIB e imposta la sua classe su DesignableLabel. Attendi che il tuo progetto venga compilato (la compilazione deve avere successo!).

Specificare la classe per UILabel


Passaggio 3: ora dovresti visualizzare una nuova proprietà nel riquadro delle proprietà denominata "Altezza riga". Basta impostare il valore che ti piace e dovresti vedere immediatamente i risultati!

Imposta l'altezza della linea nelle proprietà


2

Ecco una sottoclasse di UILabel che imposta lineHeightMultiplee si assicura che l'altezza intrinseca sia abbastanza grande da non tagliare il testo.

@IBDesignable
class Label: UILabel {
    override var intrinsicContentSize: CGSize {
        var size = super.intrinsicContentSize
        let padding = (1.0 - lineHeightMultiple) * font.pointSize
        size.height += padding
        return size
    }

    override var text: String? {
        didSet {
            updateAttributedText()
        }
    }

    @IBInspectable var lineHeightMultiple: CGFloat = 1.0 {
        didSet {
            updateAttributedText()
        }
    }

    private func updateAttributedText() {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = lineHeightMultiple
        attributedText = NSAttributedString(string: text ?? "", attributes: [
            .font: font,
            .paragraphStyle: paragraphStyle,
            .foregroundColor: textColor
        ])
        invalidateIntrinsicContentSize()
    }
}

imbottitura extra deve essere (lineHeightMultiple - 1.0) * font.pointSize, giusto?
Pavel Alexeev,

Il codice sopra com'è sembra funzionare per me. Ma forse hai ragione. Hai provato a cambiare? @PavelAlexeev
phatmann

No, resto con lineSpacing anziché lineHeightMultiple :)
Pavel Alexeev

1

In Swift 2.0 ...

Aggiungi un'estensione:

extension UIView {
    func attributesWithLineHeight(font: String, color: UIColor, fontSize: CGFloat, kern: Double, lineHeightMultiple: CGFloat) -> [String: NSObject] {
        let titleParagraphStyle = NSMutableParagraphStyle()
        titleParagraphStyle.lineHeightMultiple = lineHeightMultiple

        let attribute = [
            NSForegroundColorAttributeName: color,
            NSKernAttributeName: kern,
            NSFontAttributeName : UIFont(name: font, size: fontSize)!,
            NSParagraphStyleAttributeName: titleParagraphStyle
        ]
        return attribute
    }
}

Ora, imposta UILabel come attribuitoText:

self.label.attributedText = NSMutableAttributedString(string: "SwiftExample", attributes: attributesWithLineHeight("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0, lineHeightMultiple: 0.5))    

Ovviamente, ho aggiunto un sacco di parametri che potrebbero non essere necessari. Giocaci - sentiti libero di riscrivere il metodo - Stavo cercando questo su un sacco di risposte diverse, quindi ho pensato di pubblicare l'intera estensione nel caso in cui aiuti qualcuno là fuori ... -rab


1

Swift3 - In un'estensione UITextView o UILabel, aggiungi questa funzione:

Ho aggiunto del codice per mantenere l'attuale testo attribuito se stai già utilizzando le stringhe attribuite con la vista (invece di sovrascriverle).

func setLineHeight(_ lineHeight: CGFloat) {
    guard let text = self.text, let font = self.font else { return }

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = 1.0
    paragraphStyle.lineHeightMultiple = lineHeight
    paragraphStyle.alignment = self.textAlignment

    var attrString:NSMutableAttributedString
    if let attributed = self.attributedText {
        attrString = NSMutableAttributedString(attributedString: attributed)
    } else {
        attrString = NSMutableAttributedString(string: text)
        attrString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, attrString.length))
    }
    attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
    self.attributedText = attrString
}

1

Un'altra risposta ... Se si passa la stringa a livello di codice, è necessario passare una stringa attribuita anziché una stringa normale e modificarne lo stile. (IOS10)

NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:@"Your \nregular \nstring"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:4];
[attrString addAttribute:NSParagraphStyleAttributeName
                   value:style
                   range:NSMakeRange(0, attrString.length)];
_label.attributedText = attrString;

1

Estensione Swift 3:

    import UIKit

extension UILabel {
    func setTextWithLineSpacing(text: String, lineHeightMultiply: CGFloat = 1.3) {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = lineHeightMultiply
        paragraphStyle.alignment = .center
        let attributedString = NSMutableAttributedString(string: text)
        attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
        self.attributedText = attributedString
    }
}

1

Questo dovrebbe aiutare con esso. È quindi possibile assegnare l'etichetta a questa classe personalizzata all'interno dello storyboard e utilizzare i relativi parametri direttamente all'interno delle proprietà:

open class SpacingLabel : UILabel {

    @IBInspectable open var lineHeight:CGFloat = 1 {
        didSet {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = 1.0
            paragraphStyle.lineHeightMultiple = self.lineHeight
            paragraphStyle.alignment = self.textAlignment

            let attrString = NSMutableAttributedString(string: self.text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
            self.attributedText = attrString
        }
    } 
}

Questo dovrebbe aiutare con esso. È quindi possibile assegnare l'etichetta a questa classe personalizzata all'interno dello storyboard e utilizzare i relativi parametri direttamente all'interno delle proprietà.
Russell Warwick,

per favore non inserire contenuti relativi alla tua risposta nei commenti. la tua risposta dovrebbe essere utile senza dover leggere i commenti
Neuron,

1

Estensione dell'etichetta Swift 4. Creazione di NSMutableAttributedString prima di passare alla funzione nel caso in cui siano necessari ulteriori attributi per il testo attribuito.

extension UILabel {

    func setLineHeightMultiple(to height: CGFloat, withAttributedText attributedText: NSMutableAttributedString) {

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 1.0
        paragraphStyle.lineHeightMultiple = height
        paragraphStyle.alignment = textAlignment

        attributedText.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedText.length - 1))

        self.attributedText = attributedText
    }
}

0

Questo codice ha funzionato per me (iOS 7 e iOS 8 di sicuro).

_label.numberOfLines=2;
_label.textColor=[UIColor whiteColor];

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineHeightMultiple=0.5;
paragraphStyle.alignment = NSTextAlignmentCenter;
paragraphStyle.lineSpacing = 1.0;

NSDictionary *nameAttributes=@{
                               NSParagraphStyleAttributeName : paragraphStyle,
                               NSBaselineOffsetAttributeName:@2.0
                               };


NSAttributedString *string=[[NSAttributedString alloc] initWithString:@"22m\nago" attributes:nameAttributes];
_label.attributedText=string;

0

Ecco la mia soluzione in fretta. La sottoclasse dovrebbe funzionare sia per attributiText e proprietà text sia per characterSpacing + lineSpacing. Mantiene la spaziatura se è impostata una nuova stringa o attribuitoString.

open class UHBCustomLabel : UILabel {
    @IBInspectable open var characterSpacing:CGFloat = 1 {
        didSet {
            updateWithSpacing()
        }

    }
    @IBInspectable open var lines_spacing:CGFloat = -1 {
        didSet {
            updateWithSpacing()
        }

    }
    open override var text: String? {
        set {
            super.text = newValue
            updateWithSpacing()
        }
        get {
            return super.text
        }
    }
    open override var attributedText: NSAttributedString? {
        set {
            super.attributedText = newValue
            updateWithSpacing() 
        }
        get {
            return super.attributedText
        }
    }
    func updateWithSpacing() {
        let attributedString = self.attributedText == nil ? NSMutableAttributedString(string: self.text ?? "") : NSMutableAttributedString(attributedString: attributedText!)
        attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
        if lines_spacing >= 0 {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = lines_spacing
            paragraphStyle.alignment = textAlignment
            attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
        }
        super.attributedText = attributedString
    }
}

-5

Come soluzione veloce-sporca-intelligente-semplice:

Per UILabels che non hanno molte righe puoi invece usare stackViews.

  1. Per ogni riga scrivi una nuova etichetta.
  2. Incorporali in StackView. (Seleziona entrambe le etichette -> Editor -> Incorpora in -> StackView
  3. Regola il SpacingStackView alla quantità desiderata

Assicurati di impilarli verticalmente . Questa soluzione funziona anche con caratteri personalizzati.

inserisci qui la descrizione dell'immagine


FWIW questa è una soluzione terribile ma praticabile. Quindi lo tengo.
Miele,

Ho anche visto un principio che gli sviluppatori iOS usano stackview per creare grafici. Le visualizzazioni di stack sono molto potenti
Honey
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.