这个CustomView应该是一个类别还是一个子类?

时间:2017-03-29 04:54:50

标签: ios objective-c uiview subclass objective-c-category

我想扩展现有的自定义UIView类,以便可以在应用内的多个位置使用它。该视图有一个方法可以在一个圆圈中排列多个UIButtonsUIButtons的数量将根据调用方法的位置而有所不同。 UIButton的大小和圆的半径也是如此。能够(但不是必不可少的)能够在同一UIView.

内多次调用该方法

哪种方式更好?将其设为categorysub-class?看来我可以根据this的利弊讨论来使用。但我的问题更具体。

我已经为UIColorUIFont制作了类别,但到目前为止,我还没有能够通过关注Apple's documentation将此方法作为一个类别工作(我将其作为一个类方法和一个实例方法)。在我尝试将其作为subclass,之前可以使用之前的任何人之前,无论如何,请根据我的示例 推荐更好的方法。

以下是CustomView中的方法

circleOfButtons

- (void)circleOfButtons {

screenCentre.x                          = CGRectGetWidth  (self.bounds) / 2;
screenCentre.y                          = CGRectGetHeight (self.bounds) / 2;

for (int i = 1; i <= buttonCount; i++) {

    radians                             = 2 * M_PI * i / buttonCount;
    CGFloat arcStartPoint                 = - M_PI / 2; // first point clockwise after 12 o'clock
    buttonCentre.x                      = screenCentre.x + radius * cos(radians + arcStartPoint);
    buttonCentre.y                      = screenCentre.y + radius * sin(radians + arcStartPoint);

    CGPoint target                      = CGPointMake(buttonCentre.x, buttonCentre.y);

    CGFloat x                           = screenCentre.x - buttonSize / 2;
    CGFloat y                           = screenCentre.y - buttonSize / 2;
    CGFloat wide                        = buttonSize;
    CGFloat high                        = buttonSize;
    UIButton *circleButton              = [[UIButton alloc] initWithFrame:CGRectMake(x, y, wide, high)];

    [circleButton setTag:i];        
    circleButton.clipsToBounds          = YES;
    circleButton.layer.masksToBounds    = NO;
    circleButton.layer.borderWidth      = 0.25f;
    circleButton.layer.cornerRadius     = buttonSize/2;
    circleButton.layer.borderColor      = [UIColor blackColor].CGColor;
    circleButton.backgroundColor        = UIColor.whiteColor;
    [circleButton setTitle:[NSString stringWithFormat:@"%i", i] forState:UIControlStateNormal];

    [self addSubview:circleButton];
    // animation 1
    [UIView animateWithDuration:0.5 animations:^{
        circleButton.transform          = CGAffineTransformMakeScale(1.0, 1.0);
        circleButton.center             = screenCentre;
    }
                     completion:^(BOOL finished){}];
    // animation 2
    [UIView animateWithDuration:1.0f animations:^{
        circleButton.transform          = CGAffineTransformIdentity;
        circleButton.center             = target;
    }
                     completion:^(BOOL finished){}];
}

这是CustomView

CustomView.m

#import <UIKit/UIKit.h>
#import "CustomView.h"


@implementation CustomView : UIView

- (id)initWithFrame:(CGRect)frame {
    self                                = [super initWithFrame:[UIScreen mainScreen].bounds];
    if (self) {

    self.translatesAutoresizingMaskIntoConstraints = true;
    self.backgroundColor                = [UIColor lightGrayColor];

    buttonCount                         = 5;    //16;
    buttonSize                          = 80;   //41;
    radius                              = 68;   //105;

    [self circleOfButtons];
    }
return self;
}

CustomView.h

#import <UIKit/UIKit.h>

@interface CustomView : UIView {
    CGPoint screenCentre, buttonCentre;
    float   radius, radians, buttonSize;
    int     buttonCount;
}

ViewController.m

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    CGRect rect             = [UIScreen mainScreen].bounds;
    float  statusBarHeight  = [[UIApplication sharedApplication] statusBarFrame].size.height;
    CGRect screenFrame      = CGRectMake(0, statusBarHeight, rect.size.width, rect.size.height - statusBarHeight);
    self.view               = [[UIView alloc] initWithFrame: screenFrame];

    CustomView *cv          = [[CustomView alloc]initWithFrame:screenFrame];
    [self.view addSubview:cv];
}

0 个答案:

没有答案