2010-02-23 12 views
63

Ich möchte einem UIButton einen Schlagschatten hinzufügen. Ich habe versucht, self.layer.shadow * -Eigenschaften zu verwenden. Diese Eigenschaften funktionieren in UIView, aber sie verhalten sich in UIButton anders. Ich würde es wirklich schätzen, wenn ich irgendwelche Hinweise bekommen könnte, um den Schlagschatten zu zeichnen. Vielen Dank!Wie fügt man einem UIButton einen Schlagschatten hinzu?

self.layer.cornerRadius = 8.0f; 
self.layer.masksToBounds = YES; 
self.layer.borderWidth = 1.0f; 

self.layer.shadowColor = [UIColor greenColor].CGColor; 
self.layer.shadowOpacity = 0.8; 
self.layer.shadowRadius = 12; 
self.layer.shadowOffset = CGSizeMake(12.0f, 12.0f); 
+0

Der Core Animation Guide, http://developer.apple.com/mac/library/documentation /cocoa/conceptual/CoreAnimation_guide/Articles/LayerVisProps.html, sagt: iPhone OS Hinweis: Als Leistungsüberlegung unterstützt iPhone OS die Eigenschaften shadowColor, shadowOffset, shadowOpacity und shadowRadius nicht. Dang. –

+0

Diese Eigenschaften werden jetzt seit iOS 3.2 unterstützt. Grüße, – Quentin

Antwort

2

Sie können die UIButton-Klasse ableiten und die drawRect: -Methode überschreiben und manuell einen Schlagschatten hinzufügen. Das ist viel mehr Arbeit und Sie sollten jetzt ein paar Dinge über Quarz 2d, aber das Ergebnis ist genau das, was Sie wollen. Sonst könnten Sie einfach ein Bild hinzufügen, aber ich bevorzuge Unterklasse UIButton, weil es sehr flexibel in Bezug auf die Größe der Schaltfläche ist, ist es allgemeiner.

79

Es gibt nur einen kleinen Fehler in der Frage, der dazu führt, dass der Schatten nicht angezeigt wird: masksToBounds:YES maskiert auch den Schatten! Hier ist der korrekte Code:

self.layer.cornerRadius = 8.0f; 
self.layer.masksToBounds = NO; 
self.layer.borderWidth = 1.0f; 

self.layer.shadowColor = [UIColor greenColor].CGColor; 
self.layer.shadowOpacity = 0.8; 
self.layer.shadowRadius = 12; 
self.layer.shadowOffset = CGSizeMake(12.0f, 12.0f); 

Leider bedeutet dies, dass wir den Inhalt nicht maskieren können und gleichzeitig einen Schatten ohne Tricks haben.

Denken Sie an #import <QuartzCore/QuartzCore.h>.

37

Hier ist eine Unterklasse, die nicht nur den Schlagschatten erstellt, sondern die Schaltfläche animiert, wenn Sie darauf drücken.

// 
// ShadowButton.h 

#import <Foundation/Foundation.h> 

@interface ShadowButton : UIButton { 
} 

@end 

// 
// ShadowButton.m 

#import "ShadowButton.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation ShadowButton 

-(void)setupView{ 

    self.layer.shadowColor = [UIColor blackColor].CGColor; 
    self.layer.shadowOpacity = 0.5; 
    self.layer.shadowRadius = 1; 
    self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f); 

} 

-(id)initWithFrame:(CGRect)frame{ 
    if((self = [super initWithFrame:frame])){ 
     [self setupView]; 
    } 

    return self; 
} 

-(id)initWithCoder:(NSCoder *)aDecoder{ 
    if((self = [super initWithCoder:aDecoder])){ 
     [self setupView]; 
    } 

    return self; 
} 

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    self.contentEdgeInsets = UIEdgeInsetsMake(1.0,1.0,-1.0,-1.0); 
    self.layer.shadowOffset = CGSizeMake(1.0f, 1.0f); 
    self.layer.shadowOpacity = 0.8; 

    [super touchesBegan:touches withEvent:event]; 

} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    self.contentEdgeInsets = UIEdgeInsetsMake(0.0,0.0,0.0,0.0); 
    self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f); 
    self.layer.shadowOpacity = 0.5; 

    [super touchesEnded:touches withEvent:event]; 

} 

@end 
+0

Einfach und brauchbar, danke – webo80

49

Hier ist eine einfache Lösung, wenn Sie einen UIButton verwenden:

#import <QuartzCore/QuartzCore.h> 

button.imageView.layer.cornerRadius = 7.0f; 
button.layer.shadowRadius = 3.0f; 
button.layer.shadowColor = [UIColor blackColor].CGColor; 
button.layer.shadowOffset = CGSizeMake(0.0f, 1.0f); 
button.layer.shadowOpacity = 0.5f; 
button.layer.masksToBounds = NO; 

Gerade habe es funktioniert, und dachte, es lohnt Entsendung war. Ich hoffe, das hilft!

+1

sehr elegante Lösung! Vielen Dank! –

+1

funktionieren perfekt ... auch wenn ich nicht importieren "" Seine Arbeit für mich .. über andere Person, die ich nicht kenne. – g212gs

+0

Wenn Sie dies tun, wird Ihre assistive Touch-Lag in benutzerdefinierte Tastatur machen – TomSawyer

2

Sie können eine Unterklasse erstellen und ihre Werte in Xcode konfigurieren

Unten ist ein Beispiel:

import UIKit 
import QuartzCore 

@IBDesignable 
class CustomButton: UIButton { 

@IBInspectable var cornerRadius: CGFloat = 0 { 
    didSet { 
     layer.cornerRadius = cornerRadius 
    } 
} 

@IBInspectable var borderWidth: CGFloat = 0 { 
    didSet { 
     layer.borderWidth = borderWidth 
    } 
} 

@IBInspectable var borderColor: UIColor = UIColor.grayColor() { 
    didSet { 
     layer.borderColor = borderColor.CGColor 
    } 
} 

@IBInspectable var shadowColor: UIColor = UIColor.grayColor() { 
    didSet { 
     layer.shadowColor = shadowColor.CGColor 
    } 
} 

@IBInspectable var shadowOpacity: Float = 1.0 { 
    didSet { 
     layer.shadowOpacity = shadowOpacity 
    } 
} 

@IBInspectable var shadowRadius: CGFloat = 1.0 { 
    didSet { 
     layer.shadowRadius = shadowRadius 
    } 
} 

@IBInspectable var masksToBounds: Bool = true { 
    didSet { 
     layer.masksToBounds = masksToBounds 
    } 
} 

@IBInspectable var shadowOffset: CGSize = CGSizeMake(12.0, 12.0) { 
    didSet { 
     layer.shadowOffset = shadowOffset 
    } 
} 


} 
Verwandte Themen