Frage

HALLO. Ich brauche einen Text über eine benutzerdefinierte Schaltfläche zu schreiben. So subclassed ich UIButton. In -drawRect, schreibe ich den Text, den ich brauche. Das Problem ist, dass der Text unter der Taste endet. Nachdem ich meinen Text zu schreiben, geht voran UIButton die drawRect und zieht sich auf mich.

Ich bin nicht einmal telefonieren [super drawRect: rect] obwohl ich rechnete es nennen, bevor ich meine Zeichnung tat. Es scheint, dass UIButton der drawRect unabhängig genannt wird erhalten.

Irgendwelche Ideen? Danke.

War es hilfreich?

Lösung

Wie andere Leute schon gesagt haben, brauchen Sie nicht UIButton Unterklasse - infact es am besten nicht als UIButton ist ziemlich komplex (wie Sie gefunden). Sie haben drei Möglichkeiten:

  • die Titel der Schaltfläche freilassen, und fügen Sie den Knopf an der gewünschten Position ein neues Textfeld.
  • , wenn Sie mit 3.0 Zugriff auf die Eigenschaft label der Schaltfläche. Obwohl das Etikett selbst seine Eigenschaften nur gelesen (einschließlich Rahmen) ist es nicht.
  • Unterklasse UIControl. UIControl ist eine UIView, so dass Sie auch andere Ansichten hinzufügen können - Text und Bilder, und es ist UIView, der die Aktion Meldeverhalten (addTarget:action:forControlEvents:) implementiert. UIButton implementiert Statusbehaftung auf dieses.

Wenn Sie nicht Dinge wie setTitle:forState: der UIButton benötigen und die damit verbundene Funktionalität, aber Sie werden eine Menge von diesen Kontrollen unter Verwendung würde ich die dritte Option. Andernfalls den ersten (oder zweiten, wenn Sie auf 3.0 sind).

Andere Tipps

Das funktioniert gut für mich ... (den komplizierten Zeichencode ignorieren).

  1. Erstellen Sie eine Unterklasse von UIButton
  2. Erstellen Sie eine UIButton in Ihrem Storyboard
  3. Gehen Sie auf die Identität Inspector und geben Sie den Namen der benutzerdefinierten Schaltfläche Klasse

hier mein UIButton Code:

h-Datei:

#import <UIKit/UIKit.h>

@interface DoneButton : UIButton

@property (assign, nonatomic) BOOL selected;

@end

m-Datei:

 #import "DoneButton.h"

    @implementation DoneButton

    @synthesize selected = _selected;

    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
        }
        return self;
    }

    - (void)setSelected:(BOOL)selected
    {
        if (_selected != selected) {
            _selected = selected;
            [self setNeedsDisplay];
        }
    }


    - (void)drawRect:(CGRect)rect
    {
        // Drawing code

        if (_selected) {
            //// Color Declarations
            UIColor* color2 = [UIColor colorWithRed: 0 green: 0 blue: 0 alpha: 1];

            //// Bezier Drawing
            UIBezierPath* bezierPath = [UIBezierPath bezierPath];
            [bezierPath moveToPoint: CGPointMake(49.39, 31.25)];
            [bezierPath addLineToPoint: CGPointMake(49.39, 31.25)];
            [bezierPath addCurveToPoint: CGPointMake(46.64, 25.19) controlPoint1: CGPointMake(49.39, 29.02) controlPoint2: CGPointMake(48.38, 26.94)];
            [bezierPath addCurveToPoint: CGPointMake(44.3, 18.95) controlPoint1: CGPointMake(46.63, 22.72) controlPoint2: CGPointMake(45.88, 20.53)];
            [bezierPath addCurveToPoint: CGPointMake(42.44, 17.59) controlPoint1: CGPointMake(43.75, 18.4) controlPoint2: CGPointMake(43.13, 17.95)];
            [bezierPath addCurveToPoint: CGPointMake(38.07, 16.61) controlPoint1: CGPointMake(41.17, 16.93) controlPoint2: CGPointMake(39.67, 16.62)];
            [bezierPath addCurveToPoint: CGPointMake(33.15, 13.95) controlPoint1: CGPointMake(36.62, 15.18) controlPoint2: CGPointMake(34.95, 14.23)];
            [bezierPath addCurveToPoint: CGPointMake(32.78, 13.92) controlPoint1: CGPointMake(33.03, 13.93) controlPoint2: CGPointMake(32.9, 13.93)];
            [bezierPath addCurveToPoint: CGPointMake(32, 13.86) controlPoint1: CGPointMake(32.52, 13.89) controlPoint2: CGPointMake(32.26, 13.86)];
            [bezierPath addLineToPoint: CGPointMake(32, 13.86)];
            [bezierPath addLineToPoint: CGPointMake(32, 13.86)];
            [bezierPath addLineToPoint: CGPointMake(32, 13.86)];
            [bezierPath addLineToPoint: CGPointMake(32, 13.86)];
            [bezierPath addCurveToPoint: CGPointMake(31.38, 13.91) controlPoint1: CGPointMake(31.79, 13.86) controlPoint2: CGPointMake(31.59, 13.89)];
            [bezierPath addCurveToPoint: CGPointMake(30.85, 13.95) controlPoint1: CGPointMake(31.2, 13.92) controlPoint2: CGPointMake(31.02, 13.92)];
            [bezierPath addCurveToPoint: CGPointMake(26.92, 15.74) controlPoint1: CGPointMake(29.44, 14.17) controlPoint2: CGPointMake(28.12, 14.8)];
            [bezierPath addCurveToPoint: CGPointMake(25.94, 16.61) controlPoint1: CGPointMake(26.58, 16.01) controlPoint2: CGPointMake(26.25, 16.29)];
            [bezierPath addCurveToPoint: CGPointMake(24.13, 16.76) controlPoint1: CGPointMake(25.31, 16.61) controlPoint2: CGPointMake(24.71, 16.66)];
            [bezierPath addCurveToPoint: CGPointMake(19.7, 18.95) controlPoint1: CGPointMake(22.41, 17.06) controlPoint2: CGPointMake(20.88, 17.77)];
            [bezierPath addCurveToPoint: CGPointMake(17.36, 25.19) controlPoint1: CGPointMake(18.12, 20.53) controlPoint2: CGPointMake(17.37, 22.72)];
            [bezierPath addCurveToPoint: CGPointMake(14.61, 31.25) controlPoint1: CGPointMake(15.62, 26.94) controlPoint2: CGPointMake(14.61, 29.02)];
            [bezierPath addLineToPoint: CGPointMake(14.61, 31.25)];
            [bezierPath addCurveToPoint: CGPointMake(14.61, 31.25) controlPoint1: CGPointMake(14.61, 31.25) controlPoint2: CGPointMake(14.61, 31.25)];
            [bezierPath addCurveToPoint: CGPointMake(14.66, 31.92) controlPoint1: CGPointMake(14.61, 31.48) controlPoint2: CGPointMake(14.64, 31.7)];
            [bezierPath addCurveToPoint: CGPointMake(14.7, 32.4) controlPoint1: CGPointMake(14.67, 32.08) controlPoint2: CGPointMake(14.67, 32.24)];
            [bezierPath addCurveToPoint: CGPointMake(15.86, 35.44) controlPoint1: CGPointMake(14.86, 33.46) controlPoint2: CGPointMake(15.27, 34.48)];
            [bezierPath addCurveToPoint: CGPointMake(15.97, 35.64) controlPoint1: CGPointMake(15.9, 35.5) controlPoint2: CGPointMake(15.93, 35.57)];
            [bezierPath addCurveToPoint: CGPointMake(17.36, 37.32) controlPoint1: CGPointMake(16.36, 36.23) controlPoint2: CGPointMake(16.83, 36.78)];
            [bezierPath addCurveToPoint: CGPointMake(17.49, 38.98) controlPoint1: CGPointMake(17.36, 37.89) controlPoint2: CGPointMake(17.41, 38.44)];
            [bezierPath addCurveToPoint: CGPointMake(18.35, 41.7) controlPoint1: CGPointMake(17.65, 39.95) controlPoint2: CGPointMake(17.92, 40.87)];
            [bezierPath addCurveToPoint: CGPointMake(19.7, 43.55) controlPoint1: CGPointMake(18.7, 42.38) controlPoint2: CGPointMake(19.15, 43)];
            [bezierPath addCurveToPoint: CGPointMake(25.93, 45.89) controlPoint1: CGPointMake(21.28, 45.13) controlPoint2: CGPointMake(23.47, 45.88)];
            [bezierPath addCurveToPoint: CGPointMake(27.61, 47.28) controlPoint1: CGPointMake(26.47, 46.42) controlPoint2: CGPointMake(27.02, 46.89)];
            [bezierPath addCurveToPoint: CGPointMake(32, 48.64) controlPoint1: CGPointMake(28.96, 48.16) controlPoint2: CGPointMake(30.44, 48.64)];
            [bezierPath addLineToPoint: CGPointMake(32, 48.64)];
            [bezierPath addLineToPoint: CGPointMake(32, 48.64)];
            [bezierPath addLineToPoint: CGPointMake(32, 48.64)];
            [bezierPath addLineToPoint: CGPointMake(32, 48.64)];
            [bezierPath addCurveToPoint: CGPointMake(38.06, 45.89) controlPoint1: CGPointMake(34.23, 48.64) controlPoint2: CGPointMake(36.31, 47.63)];
            [bezierPath addCurveToPoint: CGPointMake(44.3, 43.55) controlPoint1: CGPointMake(40.53, 45.88) controlPoint2: CGPointMake(42.72, 45.13)];
            [bezierPath addLineToPoint: CGPointMake(44.3, 43.55)];
            [bezierPath addLineToPoint: CGPointMake(44.3, 43.55)];
            [bezierPath addCurveToPoint: CGPointMake(46.64, 37.31) controlPoint1: CGPointMake(45.88, 41.97) controlPoint2: CGPointMake(46.63, 39.78)];
            [bezierPath addCurveToPoint: CGPointMake(49.39, 31.25) controlPoint1: CGPointMake(48.38, 35.56) controlPoint2: CGPointMake(49.39, 33.48)];
            [bezierPath addLineToPoint: CGPointMake(49.39, 31.25)];
            [bezierPath closePath];
            [color2 setStroke];
            bezierPath.lineWidth = 1;
            [bezierPath stroke];


            //// Bezier 2 Drawing
            UIBezierPath* bezier2Path = [UIBezierPath bezierPath];
            [bezier2Path moveToPoint: CGPointMake(22.42, 29.85)];
            [bezier2Path addLineToPoint: CGPointMake(29.74, 37.17)];
            [bezier2Path addLineToPoint: CGPointMake(41.58, 25.33)];
            bezier2Path.usesEvenOddFillRule = YES;

            [color2 setStroke];
            bezier2Path.lineWidth = 1;
            [bezier2Path stroke];

        } else {

            //// Color Declarations
            UIColor* color3 = [UIColor colorWithRed: 0.5 green: 0.5 blue: 0.5 alpha: 1];

            //// Bezier 2 Drawing
            UIBezierPath* bezier2Path = [UIBezierPath bezierPath];
            [bezier2Path moveToPoint: CGPointMake(22.42, 29.85)];
            [bezier2Path addLineToPoint: CGPointMake(29.74, 37.17)];
            [bezier2Path addLineToPoint: CGPointMake(41.58, 25.33)];
            bezier2Path.usesEvenOddFillRule = YES;

            [color3 setStroke];
            bezier2Path.lineWidth = 1;
            [bezier2Path stroke];
        }
    }

, wenn die Schaltfläche ausgewählt wird, um den ersten Code ziehen, sonst den anderen Code ziehen. i bevorzugen diese Methode, weil ich Lack-Code verwenden. so dass dies eine Menge Zeit spart und Sie müssen nicht Tausende von pngs oder JPEG-Dateien erstellen.

Basierend auf Ihrem Kommentar zu einem der anderen Antworten, ist dies ein Fall von zu fragen: „Wie kann ich tun X mit Y Z zu erreichen?“ wenn Sie wirklich werden sollen fragen: „Wie kann ich Z erreichen?“

Wenn Sie eine Taste wollen, es zu zeichnen Text oben auf ein Bild, statt nächsten, einfach das Bild macht die Hintergrundbild der Schaltfläche. Verwenden Sie setBackgroundImage:forState:, anstatt setImage:forState:, dann den Titel normal.

In jedem Fall sind Sie entweder gehen das Bild in drawRect: haben zu ziehen, oder den Text in ein Subview bewegen, so dass es über dem Bild zeichnen werde. Die Lösung, die ich erwähnt ist eine Version der zweiten Option.

Sie brauchen nicht UIButton nur Unterklasse einen Text, um es hinzuzufügen. Hier ist ein Beispiel für die Schaltfläche Titel für eine benutzerdefinierte Schaltfläche in der -viewDidLoad Methode einer UIViewController Unterklasse festlegen:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 44, 44);
[button setTitle:@"x" forState:UIControlStateNormal];
[self.view addSubview:button];

Sie können auch die Schriftart Eigenschaft Ihrer Schaltfläche festlegen oder die Farbe ändern -setTitleColor mit: forState:.

Wie sei es ein Subview über die Schaltfläche Ansicht hinzufügen? Dann würden Sie die volle Kontrolle über sie haben und nicht, was die Taste tat. Man könnte wahrscheinlich sogar ein Etikett machen und ihnen die drawRect speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top