2013-04-23 3 views
0

Я рисую синусоидальную волну на UIView с помощью drawrect и связан с UIViewController. Он может нарисовать один раз, когда я сначала загружу viewcontroller. Я хочу, чтобы при изменении значения UISlider в ViewController он менял частоту синусоидальной волны. Я использую функцию setNeedsDisplay в IBAction, но это не работает. Вот мой кодsetNeedsDisplay не был вызван

//CROO.m 
#import "CROO.h" 

@implementation CROO 
@synthesize frequency; 
CGFloat fffff; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.frequency = fffff; 
     [self setNeedsDisplay]; 
     // 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)setFrequency:(CGFloat)f 
{ 
    frequency = f; 
    [self hello]; 
    NSLog(@"fre = %f",fffff); 
} 
-(void)hello 
{ 
    fffff = frequency; 
    [self setNeedsDisplay]; 
} 
@end 
//CosViewController.m 
#import "CosViewController.h" 
@interface CosViewController() 
@end 

@implementation CosViewController 
@synthesize frequency,currfrelab; 
@synthesize cro; 
float tempfreq; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    //cro = [[CROO alloc]initWithFrame:cro.frame]; 
    cro = [[CROO alloc]initWithFrame:cro.frame]; 

    //[self.view addSubview:cro]; 
    [cro setFrequency:frequency.value]; 
    //[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; 
    NSLog(@"freq = %f",cro.frequency); 
    currfrelab.text = [NSString stringWithFormat:@"Frequency = %f",frequency.value]; 
    //[self.view setNeedsDisplayInRect:cro.frame]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
-(IBAction)updatefreq:(id)sender 
{ 
    // cro = [[CROO alloc]init]; 
    CGFloat freq = [(UISlider *)sender value]; 
    // [self.view addSubview:cro]; 
    [cro setNeedsDisplay]; 
    //[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]]; 
    currfrelab.text = [NSString stringWithFormat:@"Frequency = %f",freq]; 
    //[self.view performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; 

} 
@end 
+0

PS Он может использовать данные начального значения ползунка для генерации волны. Так что класс CROO может получить значение. – IvyBB

ответ

0

Init вызывается только один раз хорошо, инициализации. Вызов setNeedsDisplay из другого контроллера, чтобы снова нарисовать drawRect.

+0

Тогда что я должен изменить? – IvyBB

+0

У меня есть функция для проверки setNeedsDisplay, но она по-прежнему не работает. - (IBAction) тестирование: (id) отправитель { [cro setFrequency: 10]; [cro setNeedsDisplay]; } Я нажимаю кнопку и вызываю эту функцию – IvyBB

+0

Вы пытаетесь вызвать setNeedsDisplay с того же представления? Вам нужно вызвать его из вашего viewController. Что-то вроде [otherView setNeedsDisplay]; –

0
-(IBAction)updatefreq:(id)sender 
{ 
    // cro = [[CROO alloc]init]; 
    CGFloat freq = [(UISlider *)sender value]; 
    **[cro setFrequency:freq];** 
    // [self.view addSubview:cro]; 
    [cro setNeedsDisplay]; 
    //[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]]; 
    currfrelab.text = [NSString stringWithFormat:@"Frequency = %f",freq]; 
    //[self.view performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; 

} 
+0

Он все еще не работает, когда я добавляю функцию set. – IvyBB

+0

- значение частоты, поступающее правильно внутри drawrect ... потому что только тогда вы увидите изменение синусоидальной волны ... – BhushanVU

+0

Я проверил, что частота значений и fffff изменяется в классе UIView. Но она не может попасть в drawrect ... Что я могу сделать? – IvyBB