drawRect没有响应setNeedsDisplay(mcve)

时间:2016-05-02 06:05:51

标签: ios objective-c

我知道这个问题已被多次询问,但我找到了部分解决方案。

我有一个自定义类GraphView,其中我有几个滑块可以更改图形参数并使用[self setNeedsDisplay]启动重绘。我可以让setNeedsDisplay工作的唯一方法是在View Controller下面放置GraphView类型的视图,在GraphView下面(和内部)使用滑块(在storyboard层次结构中)。这是有问题的,因为滑块必须在图形内。

这是一个mcve @interface:

#import <UIKit/UIKit.h>

@interface GraphView : UIView
@property float red;
@property   __weak IBOutlet UITextField *redout;
@property   UIBezierPath *aPath;
@property   CGPoint aPoint;
- (void)drawRect:(CGRect)rect;
- (id)  initWithFrame:(CGRect)frameRect;
- (IBAction)red_rabi:(id)sender;

这是mcve @implementation:

#import "GraphView.h"

@implementation GraphView

- (id)  initWithFrame:(CGRect)frameRect
{
    if ((self = [super initWithFrame:frameRect]) != nil)
    {
        _red=1.0;
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    int i;
    NSString *redstr;
    float width, height;
    width = rect.size.width;
    height = rect.size.height;
    _aPath =[UIBezierPath bezierPathWithRect:rect] ;
    [_aPath setLineWidth:1.0];
    _aPoint.x=0.0;
    _aPoint.y=0.0;
    [_aPath moveToPoint:_aPoint];
    redstr = [NSString localizedStringWithFormat:@"%6.2f", _red];
    for (i=1;i<400;i++)
{
        _aPoint.x=i*width/400.0;
        _aPoint.y=height-height*(sin(i*_red/30.)+1.0)/2.0;
        [_aPath addLineToPoint:_aPoint];
}
        [_aPath stroke];
}


- (IBAction)red_rabi:(id)sender
{
    NSString *redstr;
    UISlider *slider = (UISlider *)sender;
    _red= slider.value;
    redstr = [NSString localizedStringWithFormat:@"%6.2f", _red];
    _redout.text = redstr;
    [self setNeedsDisplay];
}

@end

如果您在视图控制器(我没有触摸)下方放置一般视图,请将通用视图的类更改为GraphView,并将一个滑块和TextField放在GraphView中(将它们连接到插座和操作),这个应用程序将生成几个正弦波周期,其频率由滑块控制,其值显示在TextField中。

如果你想在另一个视图中使用滑块和TextField,必须使用包含所有三个项目(GraphView,滑块,文本)的包络视图,并且不能使用Ctrl_drag将滑块和TextField连接到GraphView到GraphView.h文件。为了解决这个问题,我在最高级别放置了一个通用对象,并将其重命名为GraphView - 然后我可以连接滑块和TextField。尽管Textfield正确读取,但滑块不会更新GraphView。

顺便说一句,在不同的视图中,与GraphView和滑块基本相同的代码在OS X中完美运行。

抱歉此查询的长度,谢谢!

1 个答案:

答案 0 :(得分:0)

问题解决了!由于三年前的一篇有趣的SO帖子(关于连接到UIView的子视图),我发现只是从动作或出口圈(在.h文件中)拖动(不是Ctrl_drag!)到控件和那个&#39是的即使控件与子类UIView处于不同的视图中,也能完美地工作。虽然你总是拖离圈子,但与行动同样适用于行动。

感谢所有人的帮助。