0

スライダーを動かすと上下に移動するカスタム ビュー (rectView) 内に CGRect を作成しようとしています。

私のスライダーの IBAction は次のメソッドを呼び出します: (これは正常に呼び出されます)

- (void)moveRectUpOrDown:(int)y
{
    self.verticalPositionOfRect += y;
    [self setNeedsDisplay];
}

私の drawRect メソッド:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGFloat size = 100;
    self.rect = CGRectMake((self.bounds.size.width / 2) - (size / 2), 
                                 self.verticalPositionOfRect - (size / 2), 
                                 size, 
                                 size);
    CGContextAddRect(context, self.rect);
    CGContextFillPath(context);
}

私のカスタム ビューの initWithFrame は setNeedsDisplay を使用して drawRect メソッドを呼び出しますが、何らかの理由で moveRectUpOrDown が drawRect を呼び出しません。

私が間違っていることはありますか?

わかりやすくするために、実装全体を以下に示します。

//ViewController.h
#import <UIKit/UIKit.h>
#import "rectView.h"

@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet rectView *rectView;
- (IBAction)sliderChanged:(id)sender;
@end

//ViewController.m
#import "ViewController.h"

@implementation ViewController
@synthesize rectView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.rectView = [[rectView alloc] initWithFrame:self.rectView.frame];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (IBAction)sliderChanged:(id)sender 
{
    UISlider *slider = sender;
    CGFloat sliderValue = slider.value;
    [self.rectView moveRectUpOrDown:sliderValue];
}
@end

//rectView.h
#import <UIKit/UIKit.h>

@interface rectView : UIView
- (void)moveRectUpOrDown:(int)y;
@end

//rectView.m
#import "rectView.h"

@interface rectView ()
@property CGRect rect;
@property int verticalPositionOfRect;
@end

@implementation rectView
@synthesize rect, verticalPositionOfRect;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        self.verticalPositionOfRect = (self.bounds.size.height / 2);
        [self setNeedsDisplay];
    }
    return self;
}

- (void)moveRectUpOrDown:(int)y
{
    self.verticalPositionOfRect += y;
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGFloat size = 100.0;
    self.rect = CGRectMake((self.bounds.size.width / 2) - (size / 2), 
                                 self.verticalPositionOfRect - (size / 2), 
                                 size, 
                                 size);
    CGContextAddRect(context, self.rect);
    CGContextFillPath(context);
}

@end

助けてくれてありがとう :)

4

3 に答える 3

2

OK、答えは、ビューが実際にviewControllerのビューに追加されることはないということです。

あなたはあなたにを持っていIBOutletます-それで私はあなたがコンポーネントをInterfaceBuilderでrectViewドラッグし、それからそのクラスをに変更したと仮定します、それはすべて問題ありませんが、あなたはこのオブジェクトを新しいもので一掃ますUIViewviewrectViewviewDidLoad

self.rectView = [[rectView alloc] initWithFrame:self.rectView.frame];

したがって、これはxibからロードされたオブジェクトではなくなりました。

その後、このビューが実際にビュー階層に追加されることはないため、意味がないため、それ自体が描画されることはありません。

したがって、解決策は、上記で強調表示した行を削除することです。


ノート

私はおそらくそのような実装については他の答えを使うでしょうが、つまずいて新しいことを学ぶことは役に立ちます。

rectView命名規則に従っていません。理想的には、クラス名を2〜3文字の接頭辞(おそらくあなたのイニシャルまたは会社名)で始め、その後に名前の付いたキャメルケースを付ける必要があります。

于 2012-04-07T03:16:26.400 に答える
1

CGFloat サイズを初期化する方法がわかりません。そこに値を入れて、それがどのように機能するかを確認できますか? コードの残りの部分は問題ないように見えます。

于 2012-04-07T02:06:04.507 に答える
1

もっと簡単なのは、 a を追加してUIViewこれをアニメーション化することです。

これに ivar を追加しますUIView

// .h
@property (nonatomic, strong) UIView *animatedView;

// .m
@synthesize animatedView = _animatedView;

次に、ロジックをこれに置き換えます

- (void)moveRectUpOrDown:(int)y;
{
    CGRect frame = self.animatedView.frame;
    frame.origin.y += y;

    // If you want the change to animate uncomment this
    // [UIView animateWithDuration:0.25f
    //                  animations:^{
    //                      self.animatedView.frame = frame;
    //                  }];

    // If you don't want the change to animate uncomment this
    // self.animatedView.frame = frame;
}
于 2012-04-07T02:49:15.213 に答える