1

次のことを行うカスタムを書きたいと思いUIViewます。

  • 画像を取得してビューに追加します。
  • その画像を反転するメソッドがあります。

UIViewこのカスタムをiCarouselクラス に渡したい: https://github.com/nicklockwood/iCarousel

UIViewObjective 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:にを追加しないでください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 メソッドは安全に削除できます。画像を「反転」するとはどういう意味かわかりませんが、カスタム クラスの「ボックス」プロパティを使用して imageView オブジェクトを操作できるはずです。

于 2012-11-24T02:11:39.290 に答える