在drawRect:method

时间:2016-12-26 09:39:51

标签: ios objective-c xcode uiview interface-builder

我正在使用名为Circle的类(UIView的子类),它定义为IBDesignable,其某些属性定义为IBInspectable。此外,我正在尝试设置Circle类的一些标准属性,并在设计时处查看与可检查属性相同的更改。对于在Circle类上定义的可检查属性,例如strokeThickness,如果它们通过IB更改,一切正常,我会立即在我的view / xib上看到更改。

当我说xib时,我的意思是我创建了MyXib.xib文件并在其上拖了UIView,并将自定义类设置为XibOwnerClass。另外,当我加载xib时,如果更改Circle类的某些可检查属性,我会在设计时看到更改。

我如何使用它:

我在故事板上有一个视图控制器,然后我拖动一个UIView并将其类更改为XibOwnerClass。想象XibOwnerClass作为一个有Circle的班级。现在,如果我在我的xib文件中设置了圆圈有红色笔划,那么我在XibOWnerClass中进一步添加的所有圆圈都会有红色笔划,这很好。但问题是,我想在每个圈子设置startAngleendAngle

现在即使这样也行,如果我覆盖prepareForInterfaceBuilder方法并执行类似的操作:

  _circle.startAngle = 0.0f;
  _circle.endAngle = 360.0f;

  _anotherCircle.startAngle = 0.0f;
  _circle.endAngle = 270.0f;

但是,如果我点击我的xib文件,我无法在设计时看到更改,而是在运行时看到。那么如何通过这种设置在设计时看到这些变化呢?

这是一个Circle类的drawRect:方法,但我想这甚至不需要,除了它显示了那些不可检查属性的用法:

在Circle.m文件中:

#import "Circle.h"
#define getRadians(angle) ((angle) / 180.0 * M_PI)
#define getDegrees(radians) ((radians) * (180.0 / M_PI))
@implementation Circle


- (void)drawRect:(CGRect)rect {
    // Drawing code



    CGPoint centerPoint = CGPointMake(rect.size.width/2.0f, rect.size.height / 2.0f);

    UIBezierPath *path = [UIBezierPath
                          bezierPathWithArcCenter: centerPoint
                          radius:(rect.size.height / 2.0f)
                          startAngle: getRadians(self.startAngle)
                          endAngle: getRadians(self.endAngle)
                          clockwise:YES];

    CAShapeLayer *shape = [CAShapeLayer new];

    shape.path = path.CGPath;

    shape.fillColor = self.mainColor.CGColor;

    shape.strokeColor = self.strokeColor.CGColor;

    shape.lineWidth = self.ringThicknes;

    [self.layer addSublayer:shape];
}

属性在.h中定义为:

@property(nonatomic) CGFloat startAngle;

@property(nonatomic) CGFloat endAngle;

//Some more IBInspectable properties go here, and those are properties that I set when i want to affect all circles.

1 个答案:

答案 0 :(得分:1)

我已经实现了相同的解决方案,以下解决方案正在运行,请在您的.h文件中进行更改:

#ifndef IB_DESIGNABLE
#define IB_DESIGNABLE
#endif

#import <UIKit/UIKit.h>

IB_DESIGNABLE @interface Circle : UIView

@property(nonatomic)IBInspectable CGFloat startAngle;

@property(nonatomic)IBInspectable CGFloat endAngle;

@property(nonatomic)IBInspectable CGFloat ringThicknes;

@property(nonatomic)IBInspectable UIColor* mainColor;

@property(nonatomic)IBInspectable UIColor *strokeColor;

@end

在.m文件中

#import "Circle.h"
#define getRadians(angle) ((angle) / 180.0 * M_PI)
#define getDegrees(radians) ((radians) * (180.0 / M_PI))

@implementation Circle

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self drawCircle];
    }
    return self;
}

-(void)drawCircle {
    CGPoint centerPoint = CGPointMake(self.frame.size.width/2.0f, self.frame.size.height / 2.0f);

    UIBezierPath *path = [UIBezierPath
                          bezierPathWithArcCenter: centerPoint
                          radius:(self.frame.size.height / 2.0f)
                          startAngle: getRadians(self.startAngle)
                          endAngle: getRadians(self.endAngle)
                          clockwise:YES];

    CAShapeLayer *shape = [CAShapeLayer new];

    shape.path = path.CGPath;

    shape.fillColor = self.mainColor.CGColor;

    shape.strokeColor = self.strokeColor.CGColor;

    shape.lineWidth = self.ringThicknes;

    [self.layer addSublayer:shape];

}

- (void)drawRect:(CGRect)rect {
    // Drawing code
    [self drawCircle];
}

如果您仍面临同样的问题,请务必启用&#34;自动刷新视图&#34; (在:编辑器&gt;自动刷新视图)或通过&#34;刷新所有视图&#34;手动更新视图; (在:编辑器&gt;刷新所有视图)(当您需要在IB中更新时)。