有点像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属性中存储一个角度,根据该角度绘制一个片段,然后将该视图添加到主应用视图中以显示它......
为了尝试实现这一点,我在ViewController上向viewDidLoad
添加了以下测试代码:
CircleSegment *seg1 = [[CircleSegment alloc] init];
seg1.backColor = [UIColor greenColor];
seg1.angleSize = 10;
[self.view addSubview:seg1];
当我断开那些地方时似乎存储了UIColor和angleSize,但是如果我在drawRect
放置一个断点,我在CircleSegment.m上覆盖了,那么这些值已经恢复为零值(或者无论如何正确的用语是,随意纠正我。)
如果有人能指出我正确的方向,我真的很感激!
由于
答案 0 :(得分:0)
尝试在DrawRect方法中使用self.angleSize(与backColor相同)。在您的测试方法中,将10替换为10.0(以确保将其设置为浮点数)。
另外,不要忘记在dealloc中释放backColor。
答案 1 :(得分:0)
似乎存储了UIColor和 当我断点那些时,angleSize很好 但是,如果我放置一个地方 drawRect中的断点我 在CircleSegment.m上覆盖了 价值已经恢复为零 价值(或任何正确的术语 会随便纠正我。)
您确定使用的是同一个实例吗?
在NSLog(@"%@ %p", NSStringFromSelector(_cmd), self);
和viewDidLoad
中添加drawRect
之类的内容,并确保您实际处理的是同一个实例。
(我见过开发人员将alloc/initWithFrame:
视图然后使用在NIB加载期间创建的实例的情况,想知道为什么 实例未正确初始化。)