Наследование UIView - Потеря переменных экземпляра - PullRequest
0 голосов
/ 21 декабря 2010

Немного из новичка в 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, значения вернутся обратно к нулю (или каков бы ни был правильный термин, не стесняйтесь меня поправлять).

Я бы очень признателен, если кто-томы могли бы указать мне правильное направление!

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 декабря 2010

Кажется, для хранения UIColor и AngleSize хорошо, когда я остановлюсь те места, однако, если я размещу точка останова в drawRect, который я переопределено на CircleSegment.m, значения вернулись к нулю значения (или любой другой правильный термин не стесняйтесь поправлять меня).

Вы уверены, что работаете с тем же экземпляром?

Вставьте что-то вроде NSLog(@"%@ %p", NSStringFromSelector(_cmd), self); в viewDidLoad и drawRect и убедитесь, что вы имеете дело с одним и тем же экземпляром.

(Я видел случаи, когда разработчик alloc/initWithFrame: просматривал, а затем использовал экземпляр, созданный во время загрузки NIB, задаваясь вопросом, почему этот экземпляр не был правильно инициализирован.)

0 голосов
/ 21 декабря 2010

Попробуйте использовать self.angleSize в вашем методе DrawRect (то же самое с backColor).В вашем тестовом методе замените 10 на 10.0 (чтобы убедиться, что он устанавливает его как число с плавающей запятой).

Кроме того, не забудьте освободить backColor в вашем dealloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...