2016-05-02 12 views
0

この質問は何度も尋ねられていますが、私は部分的な解決策を見つけました。drawRectがsetNeedsDisplay(mcve)に応答していません

私はグラフパラメータを変更し、[self setNeedsDisplay]を使って再描画を促すいくつかのスライダを持つカスタムクラスGraphViewを持っています。私がsetNeedsDisplayを動作させるための唯一の方法は、View Controllerの直下にGraphView型を表示し、Storyboard階層のGraphViewの直下(および内部)にGraphViewを配置することです。これはスライダがグラフの内側になければならないため問題となります。ここで

は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 

あなたは、私が触れなかっただけでビューコントローラ(の下に汎用的なビューを配置する場合)、一般的なViewのクラスをGraphViewに変更し、スライダとTextFieldをGraphView内に配置します(コンセントとアクションにそれらを接続します)。このアプリケーションはスライダとその値によって制御される周波数で数サイクルの正弦波を生成しますTextFieldに表示されます。

スライダとTextFieldを別のビューに表示するには、3つのアイテム(GraphView、スライダ、テキスト)すべてのエンベロープビューを使用する必要があり、GraphView.hにCtrl_dragを使用してスライダとTextFieldをGraphViewに接続できません。ファイル。この問題を解決するために、汎用オブジェクトを最上位に置き、GraphViewという名前を付けました。次に、スライダとTextFieldを接続することができました。テキストフィールドは正しく読み込まれますが、スライダはGraphViewを更新しません。ところで

、基本的に別のビューでGraphViewとスライダーと同じコードがOS Xの

このクエリと感謝の長さのため申し訳ありませんで完璧に動作します!

+0

私たちに問題を示すためのコード例を示し、問題を再現するために使用することができます。あなたの説明からは分かりません。私は '-drawRect:'を実装したビューとは別のビューで '-setNeedsDisplay'を呼び出すと思っていますが、確かめるのは不可能です。 –

+1

私はあなたが 'setNeedsDisplay'がうまくいくので、問題の最も簡単な再現可能な例([mcve](http://stackoverflow.com/help/mcve))を作成することをお勧めします。私は何か他のことが起こっているのだろうかと思います。 – Rob

+0

「mcve」とは何を言っていますか? – matt

答えて

0

問題が解決しました。 3年前(UIViewのサブビューへの接続について)の興味深いSOのポストのために、私はコントロールまたはコントロールへのアクションサークルまたはアウトレットサークル(.hファイル内)からドラッグするだけであることを発見しました。コントロールがサブクラス化されたUIViewとは異なるビューにある場合でも完全に機能します。あなたは常にサークルからドラッグしますが、アクションと同様にアウトレットでも同じように機能します。

ご協力いただきありがとうございます。

関連する問題