实现了我自己的drawRect方法,我正在尝试从Controller类重绘形状,我无法弄清楚如何正确实现setNeedsDisplay来重绘UIView。请帮忙!!
我知道代码很难看,但这是自定义方法:
- (void)drawRect:(CGRect)rect{
// Drawing code
NSArray *kyle = [self pointsForPolygonInRect:rect numberOfSides:[pshape numberOfSides]];
CGContextRef c = UIGraphicsGetCurrentContext();
int counter = [kyle count];
NSLog(@"counter: %d",counter);
int i = 0;
BOOL first = YES;
NSValue *kylevalue;
CGPoint thePoint;
for (i = 0; i < counter; i++) {
kylevalue = [kyle objectAtIndex:i];
thePoint = [kylevalue CGPointValue];
if (first) { //start.
CGContextMoveToPoint(c, thePoint.x, thePoint.y+5.0);
first = NO;
} else { //do the rest
CGContextAddLineToPoint(c, thePoint.x, thePoint.y+5.0);
}
}
CGContextClosePath(c); //solid color
CGContextDrawPath(c, kCGPathFillStroke);
}
答案 0 :(得分:3)
我有类似的问题,重绘不能按我的预期工作。似乎setNeedsDisplay不会强制子项重绘,因为那些你需要调用它们的setNeedsDisplay方法。
根据我的需要,我写了一个类别,通过在每个视图上调用setNeedsDisplay来重绘整个屏幕。当然,这可以很容易地修改为从特定视图开始而不是所有窗口。
@implementation UIApplication (Extensions)
+ (void) redrawScreen {
NSMutableSet* todo = [NSMutableSet set];
NSMutableSet* done = [NSMutableSet set];
[todo addObjectsFromArray:[[UIApplication sharedApplication] windows]];
while ([todo count] > 0) {
UIView* view = [todo anyObject];
[view setNeedsDisplay];
[done addObject:view];
[todo removeObject:view];
if (view.subviews) {
NSMutableSet* subviews = [NSMutableSet setWithArray:view.subviews];
[subviews minusSet:done];
[todo unionSet:subviews];
}
}
}
@end
希望这对某人有帮助
答案 1 :(得分:1)
我不确定我理解你的问题。在视图上调用-setNeedsDisplay会导致它通过-drawRect:方法重绘。
答案 2 :(得分:0)
答案 3 :(得分:0)
有时候原因可能非常简单:文件所有者与UIView对象没有任何关联。即它的出口设置不正确。 使用IB,ctrl按钮和拖动方法:)
答案 4 :(得分:0)
如果您的绘图具有drawRect方法,请在连接到绘图的代码处查看viewController。这是否正确连接?属性的小圈子是空心的吗?如果财产连接正确,必须填写这个小圆圈。如果它是空心的,请调出故事板。
在故事板中找到情节对象。控制从故事板中的绘图对象拖动到视图控制器上的空心圆。现在你已经连接了出口。尝试再次运行它,看看你的drawRect现在是否被调用。