Форум программистов, компьютерный форум CyberForum.ru

Не могу очистить Context - Objective-C

Восстановить пароль Регистрация
 
LU
1 / 1 / 0
Регистрация: 06.04.2012
Сообщений: 10
06.04.2012, 16:07     Не могу очистить Context #1
Доброе время суток. Помогите пожалуйста разобраться.
Мне нужно было достать smooth рисовалку, и я взял за основу вот этот код:

SmoothLineView.h

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import <UIKit/UIKit.h>
 
 
 
@interface SmoothLineView : UIView {
    @private
    CGPoint currentPoint;
    CGPoint previousPoint1;
    CGPoint previousPoint2;
    CGFloat lineWidth;
    UIColor *lineColor;
    UIImage *curImage;
}
@property (nonatomic, retain) UIColor *lineColor;
@property (readwrite) CGFloat lineWidth;
 
@end

SmoothLineDraw.m
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#import "SmoothLineView.h"
#import <QuartzCore/QuartzCore.h>
 
#define DEFAULT_COLOR [UIColor blackColor]
#define DEFAULT_WIDTH 5.0f
 
@interface SmoothLineView () 
 
#pragma mark Private Helper function
 
CGPoint midPoint(CGPoint p1, CGPoint p2);
 
@end
 
@implementation SmoothLineView
 
#pragma mark -
 
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor whiteColor];
        self.lineWidth = DEFAULT_WIDTH;
        self.lineColor = DEFAULT_COLOR;
    }
    return self;
}
 
#pragma mark Private Helper function
 
CGPoint midPoint(CGPoint p1, CGPoint p2)
{
    return CGPointMake((p1.x + p2.x) * 0.5, (p1.y + p2.y) * 0.5);
}
 
 
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    
    UITouch *touch = [touches anyObject];
    
    previousPoint1 = [touch previousLocationInView:self];
    previousPoint2 = [touch previousLocationInView:self];
    currentPoint = [touch locationInView:self];
    
}
 
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    
    UITouch *touch  = [touches anyObject];
    
    previousPoint2  = previousPoint1;
    previousPoint1  = [touch previousLocationInView:self];
    currentPoint    = [touch locationInView:self];
    
    
    // calculate mid point
    CGPoint mid1    = midPoint(previousPoint1, previousPoint2); 
    CGPoint mid2    = midPoint(currentPoint, previousPoint1);
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, mid1.x, mid1.y);
    CGPathAddQuadCurveToPoint(path, NULL, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
    CGRect bounds = CGPathGetBoundingBox(path);
    CGPathRelease(path);
    
    CGRect drawBox = bounds;
    
    //Pad our values so the bounding box respects our line width
    drawBox.origin.x        -= self.lineWidth * 2;
    drawBox.origin.y        -= self.lineWidth * 2;
    drawBox.size.width      += self.lineWidth * 4;
    drawBox.size.height     += self.lineWidth * 4;
    
    UIGraphicsBeginImageContext(drawBox.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    curImage = UIGraphicsGetImageFromCurrentImageContext();
    [curImage retain];
    UIGraphicsEndImageContext();
 
    [self setNeedsDisplayInRect:drawBox];
}
 
- (void)drawRect:(CGRect)rect
{
    [curImage drawAtPoint:CGPointMake(0, 0)]; // зачем эта строка - я так и не понял, удалил её.
    CGPoint mid1 = midPoint(previousPoint1, previousPoint2); 
    CGPoint mid2 = midPoint(currentPoint, previousPoint1);
 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    
    //[[self layer] drawInContext:context];
 
    [self.layer renderInContext:context];
 
    CGContextMoveToPoint(context, mid1.x, mid1.y);
    // Use QuadCurve is the key
    CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y); 
    
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, self.lineWidth);
    CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
 
    CGContextStrokePath(context);
 
    [super drawRect:rect];
    
    [curImage release];
    
}
 
@synthesize lineColor,lineWidth;
@end


Я пытаюсь приделать метод очистки всего что было нарисованно, но у меня ничего не получается.
Вот что я пытался сделать:
Objective-C
1
2
3
4
5
6
-(void)clear
{
    CGContextRef context = UIGraphicsGetCurrentContext(); //записываем текущий контекст в переменную
    CGContextClearRect(context, self.frame); //очищаем
    NSLog(@"%@",context); // пишет nil
}
В консоли пишет invalid context
Но почему-то ничего не происходит. Надеюсь на помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2012, 16:07     Не могу очистить Context
Посмотрите здесь:

НЕ могу очистить корзину Windows XP
Oracle ConText - поиск
Delphi Не могу найти ошибку(очистить форму необходимо)
Ошибка при попытке очистить дерево дважды или попытке очистить и заново заполнить C++/CLI WinForms
Не могу очистить корзину Windows 7
Context Spring Java EE
C# Не могу правильно очистить listview

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LU
1 / 1 / 0
Регистрация: 06.04.2012
Сообщений: 10
09.04.2012, 02:04  [ТС]     Не могу очистить Context #2
забыл отписаться, проблему решил, дописал пару условий c этими строками в "drawRect:"
Yandex
Объявления
09.04.2012, 02:04     Не могу очистить Context
Ответ Создать тему
Опции темы

Текущее время: 19:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru