2013-09-25 37 views
14

Tôi muốn tạo lại các nút tròn được tìm thấy trong ứng dụng Đồng hồ trong iOS7. Các nút cơ bản là hình tròn với sự xuất hiện khác nhau tùy thuộc vào trạng thái nút (đường viền màu xanh lá cây, đường viền màu đỏ, màu xám).Tạo nút tròn trong iOS7 mà không cần hình ảnh

Tôi có thể đạt được điều này bằng cách sử dụng UIButton đơn giản với hình ảnh cho các trạng thái khác nhau.

Tuy nhiên tôi đang tìm kiếm một giải pháp mà vẽ vòng tròn lập trình, vì vậy tôi có thể dễ dàng thay đổi bán kính, bề dày nét vv

Theo như tôi có thể nhìn thấy UIButton chỉ cho phép tôi để xác định một UIImage cho mỗi tiểu bang , vì vậy tôi không thể sửa đổi các lớp trên mỗi trạng thái trực tiếp (ví dụ: cung cấp một lớp với angleRadius). Có cách nào khác không?

+0

Bạn đã xem là vẽ một hình tròn xem và thêm cử chỉ chạm vào nó? Chỉ là một ý nghĩ. – Douglas

+0

Có thể có thể hoạt động. Tuy nhiên tôi nghĩ để tránh tái tạo chức năng UIButton. Vì vậy, nếu có một giải pháp với một UIButton tôi sẽ thích điều đó. – henning77

Trả lời

11

Có rất nhiều cách bạn có thể thực hiện điều này, ví dụ:

  • Sử dụng CAShapedLayer

  • Subclass UIView và sử dụng drawRect: phương pháp để vẽ một vòng tròn

  • Chỉ cần có một hình vuông UIView và sử dụng thuộc tính layer.cornerRadius .

Tùy thuộc vào nhu cầu của bạn, một cái gì đó đơn giản như tạo bình thường UIButton và gọi

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

có thể làm việc (bạn sẽ cần phải bao gồm các Quartz Framework)

+1

Vâng tôi có thể vẽ một vòng tròn tốt, nhưng làm cách nào để kết nối các trạng thái vòng tròn khác nhau (đỏ, lục, xám) cho các trạng thái UIButton? Tốt hơn với ít mã nhất có thể :-) Tôi có thể kết nối nhiều người nghe và hiển thị/ẩn các vòng kết nối phù hợp, nhưng điều đó có vẻ hơi quá mức. – henning77

+0

Tôi nghĩ rằng hành động tốt nhất sẽ là tạo UIButton bình thường và thêm CAShapedLayer (với hình tròn) làm thuộc tính * mặt nạ * của lớp nút đó. –

+0

Điều đó sẽ mang lại cho tôi diện mạo tròn chung, nhưng tôi sẽ không thể xác định các màu đường viền/tô màu khác nhau cho mỗi trạng thái nút, phải không? Tôi chỉ có thể cung cấp UIImage cho mỗi tiểu bang thông qua setBackgroundImage: forState: – henning77

30

Tạo một tùy chỉnh nút có thể hữu ích.

trong tệp .h;

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

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

@end 

trong tệp .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 

Và trong bộ điều khiển xem, gọi [self.myCircleButton drawCircleButton:[UIColor myColor]]

+2

Tôi thấy rằng bạn cần sử dụng '[self.layer insertSublayer: self.circleLayer atIndex: 0];' để chèn vòng tròn bên dưới nhãn văn bản tiêu đề, nếu không nút ở dưới màu đồng nhất khi được đánh dấu. –

+1

http://stackoverflow.com/a/6954024/1091402 Đây là một cách tốt hơn nhiều. Nó giúp bạn tiết kiệm những rắc rối của việc phải đối phó với phát hiện hit, xoay, bố trí tự động vv bằng cách đơn giản là làm cho các nút tròn thay vì thêm một lớp thêm vào nó. – Rick

+0

Điều này phù hợp với tôi. Hãy chắc chắn để làm cho khung hình của bạn một hình vuông hoặc nút vòng tròn của bạn sẽ là một hình bầu dục. Bạn cũng nên thụt lề đường dẫn của vòng tròn một vài pixel để tính đến lineWidth. Nếu không, bạn kết thúc với một số cạnh phẳng ở hai bên. –

4

Các mô hình tôi đã sử dụng để đạt được loại điều là:

Subclass UIButton và thực hiện drawRect để vẽ các nút như bạn muốn, tùy chỉnh màu dựa trên các thuộc tính selectedhighlighted của nút.

Sau đó ghi đè setSelectedsetHighlighted để buộc redraws như vậy:

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

Thêm mã này

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

nơi imagePreview là UIView/UIImageView/UIButton

đừng quên thêm

#import <QuartzCore/QuartzCore.h> 
+0

Đây là giải pháp đơn giản và dễ dàng nhất.Làm việc tốt cho tôi, và siêu nhanh để thực hiện. – Nerrolken

0

Tôi nghĩ nó hoạt động tốt.

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. Trong kịch bản, Make vuông UIButton (ví dụ 100 * 100.)

  2. liên kết ổ cắm (@property ví dụ (Strong, nonatomic) UIButton IBOutlet * myButton;.)

  3. Trong mã của bạn, hãy viết: self.myButton.layer.cornerRadius = 50; // 50 là một nửa chiều dài của một cạnh.

4

Giải pháp với một mở rộng nhanh chóng:

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

Chỉ cần gọi

myView.asCircle() 

thể làm việc với bất kỳ loại xem, không chỉ là một nút

+1

Chỉnh sửa nhỏ: 'self.frame.size.width' –

Các vấn đề liên quan