我使用UIView
在drawrect
上绘制正弦波,并将其链接到UIViewController
。
我第一次加载viewcontroller时可以绘制一次。
我希望当我在UISlider
中更改ViewController
的值时,它会改变正弦波的频率。
我使用setNeedsDisplay
中的IBAction
函数,但它不起作用。
这是我的代码
//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 :(得分:0)
初始化仅在init上调用一次。从另一个控制器调用setNeedsDisplay再次弹出drawRect。
答案 1 :(得分: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];
}