iphone - titel - title tag wordpress




Wie kann ich eine Hintergrundfarbe auf dem iPhone festlegen? (13)

Kann ich deine Frage missverstanden haben, aber unten funktioniert das nicht für dich?

alt text http://img.skitch.com/20081216-fgi9eew577fncx2k3bbw3yc28d.png

Wie kann ich eine benutzerdefinierte Hintergrundfarbe für eine Schaltfläche festlegen?

Interface Builder scheint keine Schnittstelle dafür zu haben.

Ist es nur programmgesteuert verfügbar? Wenn ja, können Sie bitte ein Beispiel geben?


Ich fand, dass ich ein dehnbares Bild verwenden musste, um dies zu erreichen. Apples UICatalog-Beispiel hat eine oder mehrere farbige Schaltflächen, die auf diese Weise gezeichnet werden. Sie können ihr Vorlagenbild verwenden und es nach Ihren Bedürfnissen neu einfärben.

Ich bin mir nicht sicher, ob ich das in Interface Builder machen soll, aber ich konnte eine Schaltfläche erstellen und ein Bild für den Inhalt verwenden, indem ich den folgenden Code benutze:

downloadButton = [[UIButton alloc] initWithFrame:CGRectMake(36, 212, 247, 37)];

downloadButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
downloadButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;

[downloadButton setTitle:NSLocalizedStringFromTable(@"Download", @"Localized", nil) forState:UIControlStateNormal]; 
[downloadButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[downloadButton setFont:[UIFont boldSystemFontOfSize:14.0]];

UIImage *newImage = [[UIImage imageNamed:@"greenButton.png"] stretchableImageWithLeftCapWidth:12.0f topCapHeight:0.0f];
[downloadButton setBackgroundImage:newImage forState:UIControlStateNormal];

[downloadButton addTarget:self action:@selector(downloadNewItem) forControlEvents:UIControlEventTouchDown];

downloadButton.backgroundColor = [UIColor clearColor];
[downloadDisplayView addSubview:downloadButton];

Stellen Sie in der Schaltflächenattributpalette Ihren Knopftyp auf "Benutzerdefiniert" ein. Dadurch erhalten Sie eine quadratische Schaltfläche mit der Farbe, die Sie für den Hintergrund ausgewählt haben.

Wenn Sie eine Schaltfläche möchten, die mehr wie eine herkömmliche Schaltfläche aussieht, aber eine andere Farbe hat, die Sie benötigen, um in eine Art Bildbearbeitungssoftware zu gelangen und sie zu erstellen (ich verwende Photoshop für benutzerdefinierte Schaltflächen).


Keremk hatte recht, als er sagte, die Hintergrundfarbe "Ansicht" zu ändern, wenn man auf den Knopf geklickt und in den Inspektor gegangen sei. Dadurch werden die kleinen Ecken in die von Ihnen gewählte Farbe geändert.


Ich habe Ihre Frage gelesen, um (wie ich) eine programmatische Methode zur Festlegung der Farbe der Schaltfläche zu verlangen . Es ist eine eklatante Auslassung aus dem UIKit, und ich konnte den undokumentierten UIGlassButton nicht zum Laufen bringen.

Ich habe dies mit einem einzelnen Segment UISegmentedControl gelöst, mit dem Sie die tintColor :

UISegmentedControl * btn = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:name]];
btn.momentary = YES;
btn.segmentedControlStyle = UISegmentedControlStyleBar;
btn.tintColor = color;
[btn addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];

Beachten Sie, dass die momentary und segmentedControlStyle Eigenschaften wichtig sind und dass anstelle eines NSString * Namens ein Image verwendet werden kann.

Ein dehnbares Bild mit Endkappen funktioniert gut, wenn Sie eine begrenzte Menge von Bildern in Dosen verwenden können, aber das entspricht nicht der Anforderung! Z.B,

buttonImage   = [[UIImage imageNamed:@"button.png"] stretchableImageWithLeftCapWidth:26 topCapHeight:16];




Wenn Sie Bilder nicht verwenden möchten und genau wie im Rounded-Rect-Stil aussehen sollen, probieren Sie dies aus. Platzieren Sie einfach einen UIView über den UIButton, mit einem identischen Rahmen und einer automatischen Größenänderungsmaske, setzen Sie den Alpha auf 0.3 und setzen Sie den Hintergrund auf eine Farbe. Verwenden Sie dann das folgende Snippet, um die abgerundeten Kanten von der farbigen Überlagerungsansicht abzutrennen. Deaktivieren Sie außerdem das Kontrollkästchen "User Interaction Enabled" (Benutzerinteraktion aktiviert) in IB in der UIView, damit Berührungsereignisse auf die darunter liegende UIButton herabfallen können.

Ein Nebeneffekt ist, dass Ihr Text auch koloriert wird.

#import <QuartzCore/QuartzCore.h>

colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;

Es scheint, dass die Farbe der Knöpfe immer noch ein Problem ist. Die folgende Kategorie legt das Hintergrundbild einer Schaltfläche vollständig programmgesteuert über eine Instanzmethode fest, die einen UIColor-Parameter verwendet. Es ist nicht notwendig, Schaltflächenhintergrundbilddateien zu erstellen. Das Tastenverhalten wird basierend auf UIControlState beibehalten. Und es hält die abgerundeten Ecken.

Die Headerdatei UIButton + ColoredBackground.h

#import <UIKit/UIKit.h>

@interface UIButton (ColoredBackground)

- (void)setBackgroundImageByColor:(UIColor *)backgroundColor forState:(UIControlState)state;

@end

und der Inhalt von UIButton + ColoredBackground.m

#import "UIButton+ColoredBackground.h"
#import <QuartzCore/QuartzCore.h>

@implementation UIButton (ColoredBackground)

- (void)setBackgroundImageByColor:(UIColor *)backgroundColor forState:(UIControlState)state{

    // tcv - temporary colored view
    UIView *tcv = [[UIView alloc] initWithFrame:self.frame];
    [tcv setBackgroundColor:backgroundColor];

    // set up a graphics context of button's size
    CGSize gcSize = tcv.frame.size;
    UIGraphicsBeginImageContext(gcSize);
    // add tcv's layer to context
    [tcv.layer renderInContext:UIGraphicsGetCurrentContext()];
    // create background image now
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    // set image as button's background image for the given state
    [self setBackgroundImage:image forState:state];
    UIGraphicsEndImageContext();

    // ensure rounded button
    self.clipsToBounds = YES;
    self.layer.cornerRadius = 8.0;

    [tcv release];

}

@end

Die neue Methode wird für jede UIButton-Instanz wie folgt aufgerufen:

[myButton setBackgroundImageByColor:[UIColor greenColor] forState:UIControlStateNormal];

Ich habe ein bisschen die Code-Version von @Patch geändert. Das Problem für mich war, dass die alte Version den Eckenradius beim Umschalten von Hoch- auf Querformat irgendwie schmutzig machte. Also machte ich diese Version dehnbareImageWithLeftCapWidth: topCapHeight Methode.

#import "UIButton+ColoredBackground.h"
#import <QuartzCore/QuartzCore.h>

#define kCornerRadius 8.0f
#define kStrokeColor [UIColor blackColor]
#define kStrokeWidth 1.0f

@implementation UIButton (ColoredBackground)

- (void)setBackgroundImageByColor:(UIColor *)backgroundColor forState:(UIControlState)state{


CGSize gcSize = CGSizeMake(2*kCornerRadius +1, self.bounds.size.height);
UIGraphicsBeginImageContext(gcSize);
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeOverlay);



CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();

UIColor *gradientStart = [UIColor colorWithRed:0.80 green:0.80 blue:0.80 alpha:0.2];
UIColor * gradientEnd = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.2];
NSArray *colors = [NSArray arrayWithObjects:(id)gradientStart.CGColor, (id)gradientEnd.CGColor, nil];
CGFloat locations[2] = { 0.0f, 1.0f };
CGGradientRef _gradient = CGGradientCreateWithColors(rgb, (__bridge CFArrayRef)colors, locations);
CGColorSpaceRelease(rgb);
CGContextDrawLinearGradient(UIGraphicsGetCurrentContext(), _gradient, CGPointMake(0.0, kStrokeWidth), CGPointMake(0.0, self.bounds.size.height-kStrokeWidth), 0);

UIBezierPath *outsideEdge = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0.0, 0.0, gcSize.width, gcSize.height) cornerRadius:kCornerRadius];
[backgroundColor setFill];
[kStrokeColor setStroke];
outsideEdge.lineWidth = kStrokeWidth;
[outsideEdge stroke];
[outsideEdge fill];

// Create the background image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();    
UIGraphicsEndImageContext(); 

// Set image as button's background image (stretchable) for the given state
[self setBackgroundImage:[image stretchableImageWithLeftCapWidth:kCornerRadius topCapHeight:0.0] forState:state];

// Ensure rounded button
self.clipsToBounds = YES;
self.layer.cornerRadius = kCornerRadius;



}

@end

Die Verwendung hat sich nicht geändert. Es sieht jetzt an den Rändern klarer aus, und ich habe auch einen Gradienten hinzugefügt, um mehr Plastik zu machen. aber Sie können das auch entfernen.


Aufbauend auf @ Denny1989 Ich habe ein Problem gelöst bekommen Fehler (ungültiger Kontext 0x0) beim Einrichten der Schaltfläche in ViewDidLoad. Bevor die Schaltfläche angezeigt wird, muss die Schaltfläche angelegt werden, bevor sie eine Größe hat. Diese Kategorie fügt eine Farbe für UIControlStateNormal hinzu. Wenn andere Steuerstatus für Ihre App erforderlich sind, müssen Sie sie ähnlich der Kategorie hinzufügen.

//  UIButton+ColoredBackground.h

#import <UIKit/UIKit.h>

@interface UIButton (ColoredBackground)

@property (nonatomic, retain) UIColor *buttonColorNormal;

@property (nonatomic, retain) NSNumber *madeBackgroundImages;

- (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state;

- (void)drawRect:(CGRect)rect;

- (void)awakeFromNib;

@end

und

//  UIButton+ColoredBackground.m

#import "UIButton+ColoredBackground.h"
#import <QuartzCore/QuartzCore.h>
#import <objc/runtime.h>

#define kCornerRadius 8.0f
#define kStrokeColor [UIColor darkGrayColor]
#define kStrokeWidth 1.0f



@implementation UIButton (ColoredBackground)

static char UIB_ButtonColorNormal_KEY;
static char UIB_MadeBackgroundImages_KEY;

@dynamic buttonColorNormal;

-(void)setButtonColorNormal:(NSObject *)buttonColorNormal
{
    objc_setAssociatedObject(self, &UIB_ButtonColorNormal_KEY, buttonColorNormal, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(NSObject*)buttonColorNormal
{
    return (NSObject*)objc_getAssociatedObject(self, &UIB_ButtonColorNormal_KEY);
}

@dynamic madeBackgroundImages;

-(void)setMadeBackgroundImages:(NSObject *)madeBackgroundImages
{
    objc_setAssociatedObject(self, &UIB_MadeBackgroundImages_KEY, madeBackgroundImages, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(NSObject*)madeBackgroundImages
{
    return (NSObject*)objc_getAssociatedObject(self, &UIB_MadeBackgroundImages_KEY);
}
- (void)awakeFromNib {
    [self setMadeBackgroundImages:[NSNumber numberWithBool:FALSE]];
    [super awakeFromNib];
}

- (void)drawRect:(CGRect)rect {
    // if background images were not created from color do so here
    // if self.buttonColorNormal is not set behaves like normal button
    if ((self.buttonColorNormal)&&(![[self madeBackgroundImages] boolValue])) {
        [self setBackgroundColor:[self buttonColorNormal] forState:UIControlStateNormal];
        [self setMadeBackgroundImages:[NSNumber numberWithBool:TRUE]];
    }
    [super drawRect:rect];
}

- (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state {

    gcSize = CGSizeMake(2*kCornerRadius +1, self.bounds.size.height);
    UIGraphicsBeginImageContext(gcSize);

    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();

    UIColor *gradientStart = [UIColor colorWithRed:0.80 green:0.80 blue:0.80 alpha:0.2];
    UIColor * gradientEnd = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    NSArray *colors = [NSArray arrayWithObjects:(id)gradientStart.CGColor, (id)gradientEnd.CGColor, nil];
    CGFloat locations[2] = { 0.0f, 1.0f };
    CGGradientRef _gradient = CGGradientCreateWithColors(rgb, (__bridge CFArrayRef)colors, locations);
    CGColorSpaceRelease(rgb);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeOverlay);
    CGContextDrawLinearGradient(UIGraphicsGetCurrentContext(), _gradient, CGPointMake(0.0, kStrokeWidth), CGPointMake(0.0, self.bounds.size.height-kStrokeWidth), 0);

    UIBezierPath *outsideEdge = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0.0, 0.0, gcSize.width, gcSize.height) cornerRadius:kCornerRadius];
    [backgroundColor setFill];
    [kStrokeColor setStroke];
    outsideEdge.lineWidth = kStrokeWidth;
    [outsideEdge stroke];
    [outsideEdge fill];
    CFRelease(_gradient);

    // Create the background image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Set image as button's background image (stretchable) for the given state
    [self setBackgroundImage:[image stretchableImageWithLeftCapWidth:kCornerRadius topCapHeight:0.0] forState:state];

    // Ensure rounded button
    self.clipsToBounds = YES;
    self.layer.cornerRadius = kCornerRadius;

    // add colored border
    self.layer.borderColor = kStrokeColor.CGColor;
    self.layer.borderWidth = kStrokeWidth;
}

@end

Verwendung

- (void)viewDidLoad
{
        [myButton setButtonColorNormal:[UIColor redColor]];
}

Stellen Sie sicher, dass der Schaltflächentyp benutzerdefiniert ist oder dass drawRect nicht aufgerufen wird.








cocoa-touch