2013-09-25 9 views
14

Chciałbym odtworzyć okrągłe przyciski znajdujące się w aplikacji Zegar w iOS7. Przyciski są zasadniczo okręgami o różnym wyglądzie w zależności od stanu przycisku (zielona ramka, czerwona ramka, szare wypełnienie).Utwórz przycisk koła w iOS7 bez obrazów

Mogę oczywiście osiągnąć to za pomocą prostego UIButton z obrazami dla różnych stanów.

jednak szukam rozwiązania, które rysuje okrąg programowo, więc można łatwo zmienić promień, szerokość udar mózgu, itd

O ile widzę UIButton tylko pozwala mi zdefiniować dla każdego stanu UIImage , więc nie mogę modyfikować warstw bezpośrednio według stanu (np. zapewnić warstwę z rogiem Radius). Czy istnieje inny sposób?

+0

Czy uznać rysunek kołowej przeglądać i dodawać gesty kliknięcia do niego? Tylko myśl. – Douglas

+0

Tak, to prawdopodobnie zadziała. Pomyślałem jednak, aby nie odtwarzać funkcjonalności UIButton. Więc jeśli istnieje rozwiązanie z Uibuttonem, wolałbym to. – henning77

Odpowiedz

11

Istnieje wiele sposobów można to osiągnąć, na przykład:

  • Korzystanie CAShapedLayer

  • podklasy UIView i użyć drawRect: sposób narysować okrąg

  • Wystarczy mieć kwadrat UIView i użyj właściwości layer.cornerRadius .

W zależności od potrzeb, coś tak proste jak tworzenie normalne UIButton i nazywając

myButton.layer.cornerRadius = myButton.bounds.size.width/2.0; 

mógł pracować (będziesz musiał zawierać Quartz ramowa)

+1

Tak, mogę narysować okrąg dobrze, ale jak połączyć różne stany kół (czerwone, zielone, szare wypełnienie) z stanami UIButton? Najlepiej z tak małym kodem jak to tylko możliwe :-) Mogłem podłączyć kilku słuchaczy i odpowiednio pokazać/ukryć kółka, ale to trochę przesadzone. – henning77

+0

Myślę, że najlepszym sposobem działania byłoby utworzenie zwykłego UIButton i dodanie warstwy CAShapedLayer (o kształcie koła) jako właściwości * mask * warstwy tego przycisku. –

+0

To dałoby mi ogólny okrągły wygląd, ale nie byłbym w stanie zdefiniować różnych kolorów obramowania/wypełnienia dla każdego stanu przycisku, prawda? Mogę tylko zapewnić UIImage na stan za pomocą setBackgroundImage: forState: – henning77

30

tworzenia niestandardowego Przycisk może być pomocny.

w pliku .h;

#import <UIKit/UIKit.h> 
@interface CircleLineButton : UIButton 

- (void)drawCircleButton:(UIColor *)color; 

@end 

w pliku .m;

#import "CircleLineButton.h" 

    @interface CircleLineButton() 

    @property (nonatomic, strong) CAShapeLayer *circleLayer; 
    @property (nonatomic, strong) UIColor *color; 
    @end 

    @implementation CircleLineButton 



    - (void)drawCircleButton:(UIColor *)color 
    { 
     self.color = color; 

     [self setTitleColor:color forState:UIControlStateNormal]; 

     self.circleLayer = [CAShapeLayer layer]; 

     [self.circleLayer setBounds:CGRectMake(0.0f, 0.0f, [self bounds].size.width, 
             [self bounds].size.height)]; 
     [self.circleLayer setPosition:CGPointMake(CGRectGetMidX([self bounds]),CGRectGetMidY([self bounds]))]; 

     UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame))]; 

     [self.circleLayer setPath:[path CGPath]]; 

     [self.circleLayer setStrokeColor:[color CGColor]]; 

     [self.circleLayer setLineWidth:2.0f]; 
     [self.circleLayer setFillColor:[[UIColor clearColor] CGColor]]; 

     [[self layer] addSublayer:self.circleLayer]; 
    } 

    - (void)setHighlighted:(BOOL)highlighted 
    { 
     if (highlighted) 
     { 
      self.titleLabel.textColor = [UIColor whiteColor]; 
      [self.circleLayer setFillColor:self.color.CGColor]; 
     } 
     else 
     { 
      [self.circleLayer setFillColor:[UIColor clearColor].CGColor]; 
      self.titleLabel.textColor = self.color; 
     } 
    } 

@end 

A w kontrolerze widoku, zadzwoń [self.myCircleButton drawCircleButton:[UIColor myColor]]

+2

Stwierdziłem, że musisz użyć '[self.layer insertSublayer: self.circleLayer atIndex: 0];' aby wstawić kółko pod tytułową etykietą tekstową, w przeciwnym razie przycisk był pod jednolitym kolorem, gdy jest podświetlony. –

+1

http://stackoverflow.com/a/6954024/1091402 To znacznie lepszy sposób. Oszczędza to trudu radzenia sobie z wykrywaniem trafień, rotacją, automatycznym układaniem itp., Po prostu poprzez przycisk rundy zamiast dodawania do niego dodatkowej warstwy. – Rick

+0

To działa dobrze dla mnie. Upewnij się, że twoja ramka na guziki jest kwadratowa, a przycisk koła będzie owalny. Powinieneś także wgrać ścieżkę koła o kilka pikseli, aby obliczyć szerokość linii. W przeciwnym razie pojawi się kilka płaskich krawędzi po bokach. –

4

Wzór Użyłem do osiągnięcia tego rodzaju rzeczy jest:

Podklasa UIButton i wdrożenie drawRect wyciągnąć przycisk, jak chcesz, dostosowywanie kolorów zgodnie z właściwościami przycisku selected i highlighted.

następnie zastąpić setSelected i setHighlighted wymusić odświeżanie tak:

-(void)setHighlighted:(BOOL)highlighted { 
    [super setHighlighted:highlighted]; 
    [self setNeedsDisplay]; 
} 
4

Dodaj ten kod

imagePreview.layer.cornerRadius = (imagePreview.bounds.size.height/2); 

gdzie imagePreview jest UIView/UIImageView/UIButton

nie zapomnij dodać

#import <QuartzCore/QuartzCore.h> 
+0

To jest najprostsze i najłatwiejsze rozwiązanie.Sprawdziło się dla mnie i bardzo szybko wdrożyłem. – Nerrolken

0

Myślę, że działa dobrze.

override func viewDidLoad() { 
    super.viewDidLoad() 

    var button = UIButton.buttonWithType(.Custom) as UIButton 
    button.frame = CGRectMake(160, 100, 50, 50) 
    button.layer.cornerRadius = 0.5 * button.bounds.size.width 
    button.setImage(UIImage(named:"thumbsUp.png"), forState: .Normal) 
    button.addTarget(self, action: "thumbsUpButtonPressed", forControlEvents: .TouchUpInside) 
    view.addSubview(button) 
} 

func thumbsUpButtonPressed() { 
    println("thumbs up button pressed") 
} 
-1
  1. W serii ujęć, Pozwól kwadratowy UIButton (np 100 * 100.)

  2. wylot Link (np @property (silny, nonatomic) UIButton IBOutlet * myButton;).

  3. W kodzie wpisz: self.myButton.layer.cornerRadius = 50; // 50 to połowa długości kwadratu z jednej strony.

4

Rozwiązanie z szybkiego rozszerzenia:

extension UIView{ 
    func asCircle(){ 
     self.layer.cornerRadius = self.frame.size.width/2; 
     self.layer.masksToBounds = true 
    } 
} 

Wystarczy zadzwonić

myView.asCircle() 

Może pracować z dowolnym rodzajem widzenia, nie tylko jednego przycisku

+1

Drobna korekta: 'self.frame.size.width' –

Powiązane problemy