2013-04-29 2 views
-3

Раньше я задал вопрос в stackoverflow, и это примерно setNeedsDisplay не может работать. Я не ленивый парень, и я пробовал все, но он все еще не может работать. Возможно, я не могу найти, где проблема. Может ли кто-нибудь помочь мне разобраться с проблемой?setNeedDisplay все еще не работает

//viewcontroller.m 
#import "ViewController.h" 
@interface ViewController() 

@end 

@implementation ViewController 
@synthesize frequency; 
- (void)viewDidLoad 
{ 
    hi = [[cro alloc]init]; 
    [self.view addSubview:hi]; 
    CGFloat fu = frequency.value; 
    [hi changefreq:fu]; 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
-(IBAction)change:(id)sender 
{ 
    CGFloat fu = frequency.value; 
    [hi changefreq:fu]; 
} 
@end 
//cro.m 
#import "cro.h" 

@implementation cro 
@synthesize fffff; 
CGFloat freee; 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 
-(void)drawRect:(CGRect)rect 
{ 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetLineWidth(context, 1); 
    CGContextSetLineJoin(context, kCGLineJoinRound); 
    NSLog(@"hi i am here %f",fffff); 
    const CGFloat amplitude = 200/2; 
    for(CGFloat x = 0; x < 600; x += 0.5) 
    { 
     CGFloat y = amplitude * cosf(2 * M_PI * (x/600) * freee) + 200; 
     if(x == 0) 
      CGContextMoveToPoint(context, x, y); 
     else 
      CGContextAddLineToPoint(context, x, y); 
    } 
    CGContextSetStrokeColorWithColor(context, [[UIColor greenColor] CGColor]); 
    self.clearsContextBeforeDrawing = NO; 
    CGContextStrokePath(context); 
} 
-(void)changefreq:(CGFloat)fre 
{ 
    NSLog(@"fre= %f",fre); 
    freee = fre; 
    [self setNeedsDisplay]; 
} 

@end 

здесь является проект http://www.sendspace.com/file/lzt4b0

+1

Это очень открытый вопрос. Постарайтесь быть конкретным и объясните, почему он не работает. Например, 'changefreq:' когда-либо запускается? Является ли 'change:' прикрепленным к некоторому элементу управления (как кнопка)? –

+0

да это работает ... – IvyBB

ответ

2

Вы инициализировать вид, вызывая [[cro alloc] init]. Поскольку вы не вызываете initWithFrame:, это приведет к представлению с нулевой шириной и высотой. Вызов setNeedsDisplay на такой взгляд не влияет, потому что ничего не видно.

Измените свою первую линию в viewDidLoad к чему-то вроде

hi = [[cro alloc] initWithFrame:CGRectMake(0, 0, 320, 320)]; 

(регулировки размера по мере необходимости)

В качестве альтернативой, вы можете использовать cro экземпляр, который уже есть в вашей раскадровке вместо создавая новый. Экземпляр раскадровки - тот, который вы видите, экземпляр hi фактически невидим с вашим текущим кодом. (Кстати, если вы ожидаете других людей читать ваш код, вы можете начать использовать осмысленные имена переменных и классов.)

+0

OMG I УСПЕХ I Я ЛЮБЛЮ U <3 – IvyBB

+0

Я могу успешно обновить drawrect, но старое изображение не очищено. Как очистить представление? – IvyBB

+0

Удалите строку 'self.clearsContextBeforeDrawing = NO;'. – omz

0

следующие изменения в методе ViewController.m ViewdidLoad будет делать затруднительного положения

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    hi = [[cro alloc]initWithFrame:CGRectMake(201, 58, 414, 571)]; 
    [self.view addSubview:hi]; 
    CGFloat fu = frequency.value; 
    [hi changefreq:fu]; 
} 
0

Если следующее это работает для меня:

  • Используйте свойство вместо Ивар
    • Теперь вы получаете доступ к cro экземпляр через self.cro
    • соединения в раскадровке выпускного контроллера представления cro (уже есть свойство с именем, как это в загруженном проекте) с подвидом
  • Удалить в -[ViewController viewDidLoad:] линии, где вы создаете новый cro экземпляр и добавить это как подвид к self
  • использовать в вашем cro -класса в Ивар fffff в -[cro changefreq:] и -[cro drawRect:]

(Все это скопировано из вашего загруженного проекта только с моими изменениями)

@interface ViewController : UIViewController 

@property (strong, nonatomic) IBOutlet cro *cro; 
@property (strong, nonatomic) IBOutlet UISlider *frequency; 
-(IBAction)change:(id)sender; 
@end 

@implementation ViewController 
@synthesize frequency; 
- (void)viewDidLoad 
{ 
    CGFloat fu = frequency.value; 
    [self.cro changefreq:fu]; 
    //NSLog(@"%f",hi.fffff); 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
-(IBAction)change:(id)sender 
{ 
    CGFloat fu = frequency.value; 
    [self.cro changefreq:fu]; 
    //[hi setNeedsDisplay]; 
} 
@end 

@interface cro : UIView 
@property (nonatomic) CGFloat fffff; 
-(void)changefreq:(CGFloat)fre; 
@end 

@implementation cro 
@synthesize fffff; 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     fffff = 15; 
     // Initialization code 
    } 
    return self; 
} 
-(void)drawRect:(CGRect)rect 
{ 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetLineWidth(context, 1); 
    CGContextSetLineJoin(context, kCGLineJoinRound); 
    NSLog(@"hi i am here %f",fffff); 
    const CGFloat amplitude = 200/2; 
    for(CGFloat x = 0; x < 600; x += 0.5) 
    { 
     CGFloat y = amplitude * cosf(2 * M_PI * (x/600) * fffff) + 200; 
     if(x == 0) 
      CGContextMoveToPoint(context, x, y); 
     else 
      CGContextAddLineToPoint(context, x, y); 
    } 
    CGContextSetStrokeColorWithColor(context, [[UIColor greenColor] CGColor]); 
    self.clearsContextBeforeDrawing = NO; 
    CGContextStrokePath(context); 
} 
-(void)changefreq:(CGFloat)fre 
{ 
    NSLog(@"fre= %f",fre); 
    fffff = fre; 
    [self setNeedsDisplay]; 
} 

@end 
Смежные вопросы