无法使用我的自定义视图设置setNeedsDisplay来显示更改

时间:2012-04-07 01:58:55

标签: iphone ios cocoa quartz-graphics

我正在尝试在自定义视图(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

感谢您的帮助:)

3 个答案:

答案 0 :(得分:2)

好的,答案是视图从未实际添加到viewController的视图中。

您的IBOutletrectView - 所以我假设您将UIView组件拖到Interface Builder中的view上,然后将其类更改为{{1}在rectView中使用新对象擦除此对象

,这一切都很好

viewDidLoad

所以这现在不再是从xib加载的对象了。

随后,这个视图实际上从未被添加到视图层次结构中,所以它永远不会绘制自己,因为它没有意义。

所以解决方法是删除我在上面突出显示的行。


注释

对于这样的实现,我可能仍会继续我的另一个答案,但它有助于被绊倒并学习新的东西。

self.rectView = [[rectView alloc] initWithFrame:self.rectView.frame]; 不遵循命名约定。理想情况下,您应该使用2-3个字母前缀(可能是您的姓名或公司名称)开始您的班级名称,然后是一个名为的驼峰。

答案 1 :(得分:1)

我没看到你如何初始化CGFloat大小。你能把价值放在那里看看它是如何运作的吗?其余代码对我来说没问题。

答案 2 :(得分:1)

更简单的方法是添加UIView并为其设置动画。

为此UIView

添加一个ivar
// .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;
}