將類方法更改爲實例方法似乎解決了我的問題。
這涉及使類方法+(id)circleOfButtons:... etc
成在兩個.m
.h
和文件的實例方法(-(id)circleOfButtons:... etc
)。此外,還必須從
SGView *sgView = [SGView circleOfButtons:count buttonSize:size circleRadius:radius];
父UIView
改變呼叫
SGView *sgView = [[SGView alloc] circleOfButtons:count buttonSize:size circleRadius:radius];
和
UIView *multipleViews = [self new];
改變SGView
的聲明
UIView *multipleViews = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
SGView
可以從不同的UIViews
該改變的數量和佈置成圓形的UIButtons
尺寸現在再利用。在SGView
該代表還允許每個按鈕發送標記消息到另一個類的方法 - 在我的情況下,ViewController.
的完整列表包含下面,我會歡迎在OO更多的經驗,從別人的建議或改進節目。
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIContentContainer> {
}
@end
ViewController.m
#import "ViewController.h"
#import "FamilyView.h"
@interface ViewController()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"load FamilyView");
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];
FamilyView *cv = [[FamilyView alloc]initWithFrame:screenFrame];
[self.view addSubview:cv];
}
- (void)buttonPressed:(UIButton*)button {
NSLog(@"Button %ld clicked.", (long int)[button tag]);
switch (button.tag) {
case 1:
// [self goToFamily1];
break;
case 2:
// [self goToFamily2];
break;
case 3:
// [self goToFamily3];
break;
case 4:
// [self goToFamily4];
break;
case 5:
// [self goToFamily5];
break;
default:
// [self goToHelp];
break;
}
}
@end
FamilyView.h
#import <UIKit/UIKit.h>
#import "ViewController.h"
#import "SGView.h"
@interface FamilyView : UIView {
}
@end
FamilyView.m
#import <UIKit/UIKit.h>
#import "FamilyView.h"
#import "SGView.h"
@implementation FamilyView : UIView
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:[UIScreen mainScreen].bounds];
if (self) {
self.backgroundColor = [UIColor lightGrayColor];
int count = 5; //16;
CGFloat size = 80; //41;
CGFloat radius = 68; //105;
SGView *sgView = [[SGView alloc] circleOfButtons:count buttonSize:size circleRadius:radius];
[self addSubview:sgView];
}
return self;
}
@end
SGView.h
#import <UIKit/UIKit.h>
@protocol SGViewDelegate <NSObject>
-(void)buttonPressed:(UIButton*)button;
@end
@interface SGView : UIView {
}
-(id)circleOfButtons:(int)buttonCount buttonSize:(CGFloat)buttonSize circleRadius:(CGFloat)circleRadius;
@property (assign) id<SGViewDelegate> delegate;
@end
SGView.m
#import "SGView.h"
@implementation SGView : UIView
-(id)circleOfButtons:(int)buttonCount buttonSize:(CGFloat)buttonSize circleRadius:(CGFloat)circleRadius
{
UIView *multipleViews = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
CGPoint screenCentre;
CGPoint buttonCentre;
screenCentre.x = CGRectGetWidth ([UIScreen mainScreen].bounds)/2;
screenCentre.y = CGRectGetHeight ([UIScreen mainScreen].bounds)/2;
for (int i = 1; i <= buttonCount; i++) {
CGFloat radians = 2 * M_PI * i/buttonCount;
CGFloat arcStartPoint = - M_PI/2; // first point clockwise after 12 o'clock
buttonCentre.x = screenCentre.x + circleRadius * cos(radians + arcStartPoint);
buttonCentre.y = screenCentre.y + circleRadius * 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 addTarget:self.delegate action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
circleButton.clipsToBounds = YES;
circleButton.layer.masksToBounds = NO;
circleButton.layer.shadowOffset = CGSizeMake(-15, 20);
circleButton.layer.shadowRadius = 5;
circleButton.layer.shadowOpacity = 0.0;
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];
if (buttonCount > 25) {
[circleButton setTitleColor: [UIColor clearColor] forState:UIControlStateNormal];
} else {
[circleButton setTitleColor: [UIColor grayColor] forState:UIControlStateNormal];
}
[multipleViews 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:0.5f animations:^{
circleButton.transform = CGAffineTransformIdentity;
circleButton.center = target;
}
completion:^(BOOL finished){}];
}
return multipleViews;
}
@end