Πώς μπορείτε να προσθέσετε κείμενο πολλών γραμμών σε UIButton;

ψήφοι
313

Έχω την εξής κώδικα ...

UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @Long text string;
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];

... η ιδέα είναι ότι μπορώ να έχω κειμένου πολλαπλών γραμμών για το κουμπί, αλλά το κείμενο είναι πάντα επισκιάζεται από την backgroundImage του UIButton. Μια κλήση υλοτομία για να δείξει τις subviews του κουμπιού δείχνει ότι η UILabel έχει προστεθεί, αλλά το ίδιο το κείμενο δεν μπορεί να θεωρηθεί. Είναι αυτό ένα bug στο UIButton ή κάνω κάτι λάθος;

Δημοσιεύθηκε 03/03/2009 στις 01:22
πηγή χρήστη
Σε άλλες γλώσσες...                            


26 απαντήσεις

ψήφοι
618

Για iOS 6 και άνω, χρησιμοποιήστε την ακόλουθη να επιτρέψει πολλαπλές γραμμές:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
// you probably want to center it
button.titleLabel.textAlignment = NSTextAlignmentCenter; // if you want to 
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

Για iOS 5 και κάτω από τη χρήση τα παρακάτω για να επιτρέψει πολλαπλές γραμμές:

button.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
// you probably want to center it
button.titleLabel.textAlignment = UITextAlignmentCenter;
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

2017, για iOS9 προς τα εμπρός ,

σε γενικές γραμμές, απλά κάνει αυτά τα δύο πράγματα:

  1. επιλέξτε «αποδίδεται Κείμενο»
  2. στο αναδυόμενο παράθυρο «Γραμμή Break» επιλέξτε «Αναδίπλωση λέξεων»
Απαντήθηκε 01/12/2009 στις 23:34
πηγή χρήστη

ψήφοι
114

Η επιλεγμένη απάντηση είναι σωστή, αλλά αν προτιμάτε να το κάνετε αυτό το πράγμα στο Interface Builder μπορείτε να το κάνετε αυτό:

pic

Απαντήθηκε 14/05/2014 στις 16:36
πηγή χρήστη

ψήφοι
53

Για IOS 6:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;

Οπως και

UILineBreakModeWordWrap and UITextAlignmentCenter

έχουν αντικατασταθεί στην ΙΟΣ 6 και εξής ..

Απαντήθηκε 08/10/2012 στις 08:14
πηγή χρήστη

ψήφοι
41

Αν θέλετε να προσθέσετε ένα κουμπί με τον τίτλο στο κέντρο με πολλαπλές γραμμές, ορίστε τις ρυθμίσεις Interface Builder σας για το κουμπί:

[ εδώ]

Απαντήθηκε 21/10/2015 στις 09:03
πηγή χρήστη

ψήφοι
28

Για να επαναδιατυπώσει την πρόταση Roger Νόλαν, αλλά με σαφή κώδικα, αυτή είναι η γενική λύση:

button.titleLabel?.numberOfLines = 0
Απαντήθηκε 28/10/2010 στις 16:45
πηγή χρήστη

ψήφοι
17

SWIFT 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)
Απαντήθηκε 08/05/2017 στις 09:56
πηγή χρήστη

ψήφοι
10

Υπάρχει μια πολύ πιο εύκολο τρόπο:

someButton.lineBreakMode = UILineBreakModeWordWrap;

(Επεξεργασία για iOS 3 και αργότερα :)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
Απαντήθηκε 25/10/2009 στις 20:48
πηγή χρήστη

ψήφοι
9

Αριστερά ευθυγράμμιση στις iOS7 με αυτόματης διάταξης:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
Απαντήθηκε 28/06/2013 στις 20:07
πηγή χρήστη

ψήφοι
7

Πρώτα απ 'όλα, θα πρέπει να γνωρίζετε ότι UIButton έχει ήδη UILabel μέσα σε αυτό. Μπορείτε να ρυθμίσετε τη χρήση –setTitle:forState:.

Το πρόβλημα με το παράδειγμά σας είναι ότι θα πρέπει να ορίσετε UILabel του numberOfLinesακινήτου σε κάτι διαφορετικό από προκαθορισμένη τιμή του 1. Θα πρέπει επίσης να εξετάσει το lineBreakModeακίνητο.

Απαντήθηκε 03/03/2009 στις 09:35
πηγή χρήστη

ψήφοι
4

Απαντήσεις εδώ να σας πω πώς μπορεί να επιτευχθεί πολλών γραμμών τίτλο πλήκτρο προγραμματισμού.

Ήθελα απλώς να προσθέσω ότι αν χρησιμοποιείτε storyboards, μπορείτε να πληκτρολογήσετε [Ctrl + Enter] για να αναγκάσει μια αλλαγή γραμμής σε ένα πεδίο τίτλο κουμπί.

HTH

Απαντήθηκε 01/05/2013 στις 10:50
πηγή χρήστη

ψήφοι
4

Για εκείνους που χρησιμοποιούν storyboard Xcode 4, μπορείτε να κάνετε κλικ στο κουμπί, και στη δεξιά πλευρά παράθυρο Utilities υπό Χαρακτηριστικά Επιθεωρητή, θα δείτε μια επιλογή για την γραμμή Break. Επιλέξτε το Word Wrap, και θα πρέπει να είναι καλό να πάει.

Απαντήθηκε 09/05/2012 στις 19:12
πηγή χρήστη

ψήφοι
3

Όσον αφορά την ιδέα Brent της βάζοντας το UILabel του τίτλου ως άποψη αδελφό, δεν μου φαίνεται σαν μια πολύ καλή ιδέα. Θα κρατήσουν τη σκέψη σε προβλήματα αλληλεπίδραση με το UILabel οφείλεται σε γεγονότα αφής του να μην πάρει μέσα από την άποψη της UIButton του.

Από την άλλη πλευρά, με UILabel ως δευτερεύουσας προβολής της UIButton, είμαι πολύ άνετα γνωρίζοντας ότι τα γεγονότα αφής θα είναι πάντα να διαδοθεί σε superview του UILabel του.

Έκανα αυτή την προσέγγιση και δεν παρατηρήσετε κάποια από τα προβλήματα που αναφέρθηκαν με το backgroundImage. Πρόσθεσα αυτόν τον κωδικό στην -titleRectForContentRect: μια υποκατηγορία UIButton, αλλά ο κώδικας μπορεί επίσης να τοποθετηθεί στην κατάρτιση ρουτίνα της superview UIButton, το οποίο στην περίπτωση αυτή θα πρέπει να αντικατασταθούν όλες οι αναφορές σε αυτο με μεταβλητή του UIButton του.

#define TITLE_LABEL_TAG 1234

- (CGRect)titleRectForContentRect:(CGRect)rect
{   
    // define the desired title inset margins based on the whole rect and its padding
    UIEdgeInsets padding = [self titleEdgeInsets];
    CGRect titleRect = CGRectMake(rect.origin.x    + padding.left, 
                                  rect.origin.x    + padding.top, 
                                  rect.size.width  - (padding.right + padding.left), 
                                  rect.size.height - (padding.bottom + padding].top));

    // save the current title view appearance
    NSString *title = [self currentTitle];
    UIColor  *titleColor = [self currentTitleColor];
    UIColor  *titleShadowColor = [self currentTitleShadowColor];

    // we only want to add our custom label once; only 1st pass shall return nil
    UILabel  *titleLabel = (UILabel*)[self viewWithTag:TITLE_LABEL_TAG];


    if (!titleLabel) 
    {
        // no custom label found (1st pass), we will be creating & adding it as subview
        titleLabel = [[UILabel alloc] initWithFrame:titleRect];
        [titleLabel setTag:TITLE_LABEL_TAG];

        // make it multi-line
        [titleLabel setNumberOfLines:0];
        [titleLabel setLineBreakMode:UILineBreakModeWordWrap];

        // title appearance setup; be at will to modify
        [titleLabel setBackgroundColor:[UIColor clearColor]];
        [titleLabel setFont:[self font]];
        [titleLabel setShadowOffset:CGSizeMake(0, 1)];
        [titleLabel setTextAlignment:UITextAlignmentCenter];

        [self addSubview:titleLabel];
        [titleLabel release];
    }

    // finally, put our label in original title view's state
    [titleLabel setText:title];
    [titleLabel setTextColor:titleColor];
    [titleLabel setShadowColor:titleShadowColor];

    // and return empty rect so that the original title view is hidden
    return CGRectZero;
}

Έκανα το χρόνο και την έγραψε λίγο περισσότερα για αυτό εδώ . Εκεί, θα ήθελα επίσης σημείο μικρότερη λύση, αν και δεν είναι αρκετά ταιριάζουν όλα τα σενάρια και περιλαμβάνει κάποιες προσωπικές απόψεις hacking. Επίσης εκεί, μπορείτε να κατεβάσετε μια υποκατηγορία UIButton έτοιμο να χρησιμοποιηθεί.

Απαντήθηκε 09/03/2009 στις 15:25
πηγή χρήστη

ψήφοι
2

Θα πρέπει να προσθέσετε αυτόν τον κώδικα:

buttonLabel.titleLabel.numberOfLines = 0;
Απαντήθηκε 21/02/2018 στις 11:41
πηγή χρήστη

ψήφοι
2

Εάν χρησιμοποιείτε την αυτόματη διάταξη.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2
Απαντήθηκε 09/12/2016 στις 10:55
πηγή χρήστη

ψήφοι
2

Ρύθμιση lineBreakMode να NSLineBreakByWordWrapping (είτε σε ΙΒ ή κωδικό) κάνει πολλών γραμμών ετικέτα του κουμπιού, αλλά δεν επηρεάζει το πλαίσιο κουμπιού.

Αν το κουμπί έχει δυναμική τίτλο, υπάρχει ένα τέχνασμα: να θέσει κρυφές UILabel με ίδια γραμματοσειρά και γραβάτα είναι το ύψος στο ύψος κουμπί με διάταξη? όταν ρυθμίσετε το κείμενο για να το κουμπί και ετικέτα και αυτόματης διάταξης θα κάνει όλη τη δουλειά.

Σημείωση

Εγγενής ύψος μέγεθος του κουμπιού μίας γραμμής είναι μεγαλύτερο από ετικέτας, έτσι ώστε να αποφευχθεί το ύψος ετικέτας συρρικνωθεί είναι κάθετη Περιεχόμενο Προτεραιότητα αγκάλιασμα πρέπει να είναι μεγαλύτερη από κάθετη Περιεχόμενο κουμπιού συμπίεσης Αντίστασης.

Απαντήθηκε 31/08/2015 στις 20:21
πηγή χρήστη

ψήφοι
2

Εάν χρησιμοποιείτε την αυτόματη διάταξη για iOS 6 μπορεί επίσης να χρειαστεί να ρυθμίσετε το preferredMaxLayoutWidthακίνητο:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;
Απαντήθηκε 01/05/2013 στις 19:45
πηγή χρήστη

ψήφοι
2

Λειτουργεί άψογα.

Προσθήκη στη χρήση αυτή με το αρχείο config όπως Plist, θα πρέπει να χρησιμοποιήσετε CDATA για να γράψει το multilined τίτλο, όπως αυτό:

<string><![CDATA[Line1
Line2]]></string>
Απαντήθηκε 11/05/2011 στις 11:04
πηγή χρήστη

ψήφοι
1
self.btnError.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)
Απαντήθηκε 03/08/2017 στις 09:40
πηγή χρήστη

ψήφοι
0

Σε Swift 5.0 και Xcode 10.2

SharedClass παράδειγμα γράψετε μια φορά και να χρησιμοποιούν κάθε υγιεινής

Αυτό είναι κοινόχρηστο τάξη σας (όπως αυτό που χρησιμοποιούν όλα τα στοιχεία του ιδιότητες)

import UIKit

class SharedClass: NSObject {

     static let sharedInstance = SharedClass()

     private override init() {

     }
  }

//UIButton extension
extension UIButton {
     //UIButton properties
     func btnMultipleLines() {
         titleLabel?.numberOfLines = 0
         titleLabel?.lineBreakMode = .byWordWrapping
         titleLabel?.textAlignment = .center        
     }
}

Σε σας ViewController κλήση όπως αυτό

button.btnMultipleLines()//This is your button
Απαντήθηκε 29/04/2019 στις 07:54
πηγή χρήστη

ψήφοι
0

Είχα ένα πρόβλημα με την αυτόματη διάταξη, μετά την ενεργοποίηση πολλαπλών γραμμών το αποτέλεσμα ήταν κάπως έτσι: έτσι το μέγεθος δεν επηρεάζει το μέγεθος κουμπί Έχω προσθέσει με βάση (σε αυτή την περίπτωση contentEdgeInsets ήταν (10, 10, 10, 10 ) μετά την κλήση : ελπίζω να σας (ταχεία 5.0 βοηθήσει):
εισάγετε περιγραφή της εικόνας εδώ
titleLabel
ConstraintscontentEdgeInsets
makeMultiLineSupport()
εισάγετε περιγραφή της εικόνας εδώ

extension UIButton {

    func makeMultiLineSupport() {
        guard let titleLabel = titleLabel else {
            return
        }
        titleLabel.numberOfLines = 0
        titleLabel.setContentHuggingPriority(.required, for: .vertical)
        titleLabel.setContentHuggingPriority(.required, for: .horizontal)
        addConstraints([
            .init(item: titleLabel,
                  attribute: .top,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .top,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.top),
            .init(item: titleLabel,
                  attribute: .bottom,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .bottom,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.bottom),
            .init(item: titleLabel,
                  attribute: .left,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .left,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.left),
            .init(item: titleLabel,
                  attribute: .right,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .right,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.right)
            ])
    }

}
Απαντήθηκε 11/04/2019 στις 21:25
πηγή χρήστη

ψήφοι
0

Αυτές τις μέρες, αν χρειάζεστε πραγματικά αυτό το είδος του πράγματος ώστε να είναι προσβάσιμα σε οικοδόμος διεπαφή για κάθε περίπτωση χωριστά, μπορείτε να το κάνετε με μια απλή προέκταση όπως αυτό:

extension UIButton {
    @IBInspectable var numberOfLines: Int {
        get { return titleLabel?.numberOfLines ?? 1 }
        set { titleLabel?.numberOfLines = newValue }
    }
}

Στη συνέχεια, μπορείτε να ορίσετε απλά numberOfLines ως χαρακτηριστικό σε κάθε UIButton ή UIButton υποκατηγορία σαν να ήταν μια ετικέτα. Το ίδιο ισχύει και για μια ολόκληρη σειρά από άλλες συνήθως-απρόσιτη αξίες, όπως η ακτίνα της γωνίας του στρώματος Α άποψη του, ή τα χαρακτηριστικά της σκιάς που ρίχνει.

Απαντήθηκε 17/11/2018 στις 07:12
πηγή χρήστη

ψήφοι
0

Στο Xcode 9.3 μπορείτε να το κάνετε χρησιμοποιώντας storyboard όπως παρακάτω,

εισάγετε περιγραφή της εικόνας εδώ

Θα πρέπει να ορίσετε textAlignment τίτλο κουμπί στο κέντρο

button.titleLabel?.textAlignment = .center

Δεν χρειάζεται να ορίσετε κείμενο τίτλου με νέα γραμμή (\ n) όπως παρακάτω,

button.setTitle("Good\nAnswer",for: .normal)

Απλά ρυθμίστε τον τίτλο,

button.setTitle("Good Answer",for: .normal)

Εδώ είναι το αποτέλεσμα,

εισάγετε περιγραφή της εικόνας εδώ

Απαντήθηκε 31/05/2018 στις 06:14
πηγή χρήστη

ψήφοι
0

Θα ενσωματωθεί απάντηση jessecurry του μέσα STAButton που αποτελεί μέρος του μου STAControls βιβλιοθήκη ανοιχτού κώδικα. Το χρησιμοποιώ σήμερα σε μία από τις εφαρμογές που έχω την ανάπτυξη και λειτουργεί για τις ανάγκες μου. Μη διστάσετε να ανοίξει θέματα σχετικά με το πώς να βελτιώσουν ή να μου στείλει τραβήξει τα αιτήματα.

Απαντήθηκε 05/05/2018 στις 23:27
πηγή χρήστη

ψήφοι
0

ταχεία 4.0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)
Απαντήθηκε 25/03/2018 στις 12:50
πηγή χρήστη

ψήφοι
0

Ανοίγουμε τη δική σας κατηγορία κουμπί. Είναι μακράν η καλύτερη λύση μακροπρόθεσμα. UIButton και άλλες κατηγορίες UIKit είναι πολύ περιοριστικό για το πώς μπορείτε να τις προσαρμόσετε.

Απαντήθηκε 10/03/2009 στις 14:16
πηγή χρήστη

ψήφοι
-3

Παρά το γεγονός ότι είναι εντάξει για να προσθέσετε μια δευτερεύουσας προβολής σε έλεγχο, δεν υπάρχει καμία εγγύηση ότι θα λειτουργούν πραγματικά, γιατί ο έλεγχος δεν μπορεί να αναμένουν ότι θα είναι εκεί και θα μπορούσε έτσι να συμπεριφέρονται άσχημα. Εάν μπορείτε να πάρετε μακριά με αυτό, απλά προσθέστε την ετικέτα ως στόχο αδελφό του κουμπιού και ρυθμίστε το πλαίσιό του, έτσι ώστε να επικαλύπτει το κουμπί? εφ 'όσον έχει ρυθμιστεί να εμφανίζεται στο πάνω μέρος του πλήκτρου, τίποτα το κουμπί μπορεί να κάνει θα το επισκιάζει.

Με άλλα λόγια:

[button.superview addSubview:myLabel];
myLabel.center = button.center;
Απαντήθηκε 03/03/2009 στις 13:04
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more