1

我想编写一个UIView执行以下操作的自定义:

  • 它获取图像并将其添加到视图中。
  • 它有一种翻转该图像的方法。

我想将此自定义传递UIViewiCarousel班级: https ://github.com/nicklockwood/iCarousel

如何UIView使用 Objective C 和 Cocoa 创建自定义?

我开始执行以下操作:

CItem.h

#import <UIKit/UIKit.h>

@interface CItem : UIView
{
    UIImageView *box;
}

@property (nonatomic, retain) UIImageView * box;


@end

CItem.m

#import "CItem.h"

@implementation CItem

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}


- (void)drawRect:(CGRect)rect {
    // Drawing code
    box = [[UIImageView alloc] initWithFrame:CGRectMake(0,0, 240, 240)];

    [box setImage:[UIImage imageNamed:@ "cleaning.png"]];
    [self addSubview:box];
}


@end
4

2 回答 2

6

你不应该添加你的addSubview:in drawRect:。请参阅此方法的讨论:

讨论

此方法的默认实现什么也不做。使用原生绘图技术(如 Core Graphics 和 UIKit)来绘制其视图内容的子类应覆盖此方法并在那里实现其绘图代码。如果您的视图以其他方式设置其内容,则无需重写此方法。例如,如果您的视图仅显示背景颜色,或者您的视图直接使用底层图层对象设置其内容,则不需要覆盖此方法。同样,如果您的视图使用 OpenGL ES 进行绘图,则不应覆盖此方法。

如果您不使用 xib 文件,您CItem可以将代码添加到initWithFrame:.

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

@interface CItem : UIView

- (void)flip;

@end

// CItem.m
#import "CItem.h"

@interface CItem()

@property (assign, nonatomic) BOOL displayingPrimary;

@property (strong, nonatomic) UIImageView *primaryView;
@property (strong, nonatomic) UIImageView *secondaryView;

@end

@implementation CItem

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _primaryView = [[UIImageView alloc] initWithFrame:frame];
        [_primaryView setImage:[UIImage imageNamed:@ "cleaning.jpg"]];
        [self addSubview:_primaryView];

        _secondaryView = [[UIImageView alloc] initWithFrame:frame];
        [_secondaryView setImage:[UIImage imageNamed:@ "adding.jpg"]];
        [self addSubview:_secondaryView];

    }
    return self;
}

- (void)flip
{
    [UIView transitionFromView:(self.displayingPrimary ? self.primaryView : self.secondaryView)
                        toView:(self.displayingPrimary ? self.secondaryView : self.primaryView)
                      duration:1.0
                       options:(self.displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight :
                                UIViewAnimationOptionTransitionFlipFromLeft) | UIViewAnimationOptionShowHideTransitionViews
                    completion:^(BOOL finished) {
                        if (finished) {
                            self.displayingPrimary = !self.displayingPrimary;
                        }
                    }];
}

@end

然后你可以CItem像这样使用:

CItem *subView = [[CItem alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
[self.view addSubview:subView];
于 2012-11-24T05:59:01.773 回答
3

如果您打算进行自定义绘图,则应仅实现 drawRect。如果你想使用子视图,你可以将你的代码移动到 initWithFrame 中:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
       box = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 240.0f, 240.0f)];
       [box setImage:[UIImage imageNamed:@"cleaning"]];
       [self addSubview:box];
    }
    return self;
}

您可以安全地删除 drawRect 方法。不确定“翻转”图像是什么意思,但您应该能够使用自定义类的“box”属性来操作 imageView 对象。

于 2012-11-24T02:11:39.290 回答