Немного из новичка в Objective-C, я искал ответ, но не смог его найти, так что простите меня, если это очевидный вопрос.
По сути, мне нужно нарисоватьна сегментах экрана круга (например, сегмент на 90 градусов, где горизонтальная и вертикальная линия встречаются внизу слева и дуга соединяет конечные точки).Мне удалось добиться этого в пользовательском классе CircleSegment , который наследует UIView и переопределяет drawRect
.
Моя проблема заключается в достижении этого программно;Мне нужен какой-то способ создания моего класса CircleSegment и сохранения в нем нужного угла перед тем, как нарисовать сам сегмент.
Вот что у меня есть:
CircleSegment.h
#import <UIKit/UIKit.h>
@interface CircleSegment : UIView {
float angleSize;
UIColor *backColor;
}
-(float)convertDegToRad:(float)degrees;
-(float)convertRadToDeg:(float)radians;
@property (nonatomic) float angleSize;
@property (nonatomic, retain) UIColor *backColor;
@end
CircleSegment.m
#import "CircleSegment.h"
@implementation CircleSegment
@synthesize angleSize;
@synthesize backColor;
// INITIALISATION OVERRIDES
// ------------------------
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
self.opaque = NO;
self.backgroundColor = [UIColor clearColor];
}
return self;
}
- (void)setBackgroundColor:(UIColor *)newBGColor
{
// Ignore.
}
- (void)setOpaque:(BOOL)newIsOpaque
{
// Ignore.
}
// MATH FUNCTIONS
// --------------
// Converts degrees to radians.
-(float)convertDegToRad:(float)degrees {
return degrees * M_PI / 180;
}
// Converts radians to degrees.
-(float)convertRadToDeg:(float)radians {
return radians * 180 / M_PI;
}
// DRAWING CODE
// ------------
- (void)drawRect:(CGRect)rect {
float endAngle = 360 - angleSize;
UIBezierPath* aPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 100)
radius:100
startAngle:[self convertDegToRad:270]
endAngle:[self convertDegToRad:endAngle]
clockwise:YES];
[aPath addLineToPoint:CGPointMake(100.0, 100.0)];
[aPath closePath];
CGContextRef aRef = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(aRef, backColor.CGColor);
CGContextSaveGState(aRef);
aPath.lineWidth = 1;
[aPath fill];
[aPath stroke];
//CGContextRestoreGState(aRef);
}
- (void)dealloc {
[super dealloc];
}
@end
Обратите внимание, что файл .m немного запутан с различными битами тестового кода...
По сути, я хочу создать экземпляр CircleSegment, сохранить угол в свойстве angleSize, нарисовать сегмент на основе этого угла, а затем добавить этот вид в основной вид приложения, чтобы отобразить его ...
Чтобы попытаться достичь этого, я добавил следующий тестовый код в viewDidLoad
на моем ViewController:
CircleSegment *seg1 = [[CircleSegment alloc] init];
seg1.backColor = [UIColor greenColor];
seg1.angleSize = 10;
[self.view addSubview:seg1];
Кажется, что UIColor и angleSize отлично сохраняются, когда я ставлю точку остановав тех местах, однако, если я установлю точку останова в drawRect
, которую я переопределил на CircleSegment.m, значения вернутся обратно к нулю (или каков бы ни был правильный термин, не стесняйтесь меня поправлять).
Я бы очень признателен, если кто-томы могли бы указать мне правильное направление!
Спасибо