我知道这个问题已被多次询问,但我找到了部分解决方案。
我有一个自定义类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中完美运行。
抱歉此查询的长度,谢谢!
答案 0 :(得分:0)
问题解决了!由于三年前的一篇有趣的SO帖子(关于连接到UIView的子视图),我发现只是从动作或出口圈(在.h文件中)拖动(不是Ctrl_drag!)到控件和那个&#39是的即使控件与子类UIView处于不同的视图中,也能完美地工作。虽然你总是拖离圈子,但与行动同样适用于行动。
感谢所有人的帮助。