1

現在、UIScrollView オブジェクトに UIImage を動的に追加していますが、すべてが意図したとおりに機能しています。今すぐ追加機能を追加する必要があります (インターネットからロードするときに画像の中央にある UIActivityIndi​​cator とその下のラベル) ので、必要に応じてこれらすべてを配置したカスタム ビューを作成しない理由を考えました。それをscrollViewにロードするだけです。問題が発生しましたが、scrollView に追加しても何も表示されません。これが私が持っているものです:

NewsViewController.m:

imageScrollView.contentSize = CGSizeMake(320*numberOfPages, 303);
pageControl.numberOfPages = numberOfPages;
dispatch_queue_t imageDownload = dispatch_queue_create("imageDownload", NULL);
__block NSData *temp;
    CustomImageView *customImageView = [[CustomImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 303)];
    [imageScrollView addSubview:customImageView];
    [[customImageView activityIndicator] startAnimating];
    dispatch_async(imageDownload, ^{
        temp = [[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.wlfarm.org/wp-content/uploads/2012/05/farm.jpg"]]retain];
        dispatch_async(dispatch_get_main_queue(), ^{
            customImageView.imageView.image = [[UIImage alloc] initWithData:temp];
            [[customImageView activityIndicator] stopAnimating];
            [customImageView setNeedsDisplay];
            customImageView.caption.text = @"HAHAHAHAHHAHA";
            [imageScrollView setNeedsDisplay];
            [temp release];
        });
    });

    dispatch_release(imageDownload);

CustomImageView.h:

#import <UIKit/UIKit.h>

@interface CustomImageView : UIView
{
    IBOutlet UIImageView *imageView;
    IBOutlet UILabel *caption;
    IBOutlet UIActivityIndicatorView *activityIndicator;
}

@property (nonatomic, retain) IBOutlet UIImageView *imageView;
@property (nonatomic, retain) IBOutlet UILabel *caption;
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *activityIndicator;
@end

CustomImageView.m

#import "CustomImageView.h"  
@interface CustomImageView ()

@end

@implementation CustomImageView

@synthesize caption, imageView, activityIndicator;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

 - (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

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

@end

XIB ファイルのスクリーンショットと、シミュレーターで実行されているプログラムを含めています。最初の画像は scrollView に何も表示されません (私のカスタム クラスを使用して行われた試行)。スクロール ビューの 2 番目のページは、UIImageView を UIScrollView に追加することによって行われた試行です (機能しました)。誰かが私が間違っていることを指摘できますか? カスタム ビューを UIScrollView に読み込むことはできませんか? ご協力いただきありがとうございます!

IB スクリーンショット - http://i.stack.imgur.com/gz9UL.png

iOS シミュレータ CustomView スクリーンショットの画像なし - http://i.stack.imgur.com/zhswq.png

UIImageView スクリーンショットを含む iOS シミュレーター イメージ - http://i.stack.imgur.com/97vmU.png

4

2 に答える 2

1

またはではなくCustomImageView、のサブクラスのように見えます。そのようなサブビューとしてを追加することはできません。サブクラスに変更すると、機能するはずです。UIViewControllerUIImageViewUIViewUIViewControllerUIView

UIView.nibからをロードするには、。IBOutletの場合と同じようにプロパティを宣言する必要がありますUIViewController。IBで正しいカスタムクラスを定義し、ベースビューを含むすべてを接続します。次に、カスタムビュークラス内で次のメソッドをオーバーライドします。

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
    // Initialization code.
    //
    [[NSBundle mainBundle] loadNibNamed:@"<NIB NAME HERE>" owner:self options:nil];
    [self addSubview:self.view];
    }
  return self;
}

UIViewControllerサブクラスからサブクラスにメソッドを切り取って貼り付けたようですUIView@synthesizeとの間に貼り付けたすべてのメソッドを削除することから始めます @end。サブクラスは、.nibからロードするUIViewためにさまざまなメソッドを必要とするため、代わりに上記のメソッドをオーバーライドして、コード行を使用する必要があります

[[NSBundle mainBundle] loadNibNamed:@"<NIB NAME HERE>" owner:self options:nil];

ペン先をロードします。

ベースビューの接続についてのコメントに加えて、これが私が意味することです:

カスタムクラスとnibファイルを作成したら、nibを開いて左側の[ファイルの所有者]を強調表示し、右上で、左から3番目のアイコンを選択します。これはIDカードなどのように見えます。[クラス]ボックスに、カスタムクラスの名前を追加します。

customClassで、baseViewというIBOutlet UIViewプロパティを追加し、ルートレベルでIBのビューをカバーするUIViewを追加して、これら2つを接続します。次に、その上に他のすべてを追加します

コードは次のようになります。

CustomImageView.h

#import <UIKit/UIKit.h>

@interface CustomImageView : UIView
{
    IBOutlet UIView *baseView
    IBOutlet UIImageView *imageView;
    IBOutlet UILabel *caption;
    IBOutlet UIActivityIndicatorView *activityIndicator;
}
@property (nonatomic, retain) IBOutlet UIView *baseView;
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
@property (nonatomic, retain) IBOutlet UILabel *caption;
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *activityIndicator;
@end

CustomImageView.m

#import "CustomImageView.h"  
@interface CustomImageView ()

@end

@implementation CustomImageView

@synthesize baseView, caption, imageView, activityIndicator;

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
    // Initialization code.
    //
    [[NSBundle mainBundle] loadNibNamed:@"<NIB NAME HERE>" owner:self options:nil];
    [self addSubview:self.baseView];
    }
  return self;
}

@end

すべてをIBで接続すると、正常に機能するはずです。baseViewを追加することを忘れないでください。

于 2012-07-24T09:42:14.877 に答える
0

前述のようinitWithNibNameに、コントローラーに属します。
私が思うに、あなたは間違った方向に進んでいます。

ViewController があり、customView を追加して、URLData から画像を動的にロードしたい場合。

2 つのオプションがあります:
オプション 1: IB ですべてを行います:
Interfacebuilder で ViewController の XIB ファイルを編集/(または新しいものを追加) し、好きなビューを追加します。ファイルの所有者は UIViewController クラス/サブクラスです。View Controllerで行うことを除いて、以前と同じようにすべてを行います。あなたの App デリゲート initWithNibName では、ViewController のように

    self.viewController = [[testViewController alloc] initWithNibName:@"testViewController" bundle:nil];

必要に応じて、プッシュしたい独自のView Controllerを初期化し、スタックにプッシュします。

あなたが間違っていること: Frame で customImageView を初期化していますが、ペン先は自動的に読み込まれません。プロパティはありますが、ペン先はありません。

本当に安定したものが必要な場合は、
オプション 2 を選択してください: プログラムですべてを実行します(より簡単で、理解しやすく、軽量です):
実装から次のことを行います。

NewsViewController.m

前と同じようにしてください!!!

CustomImageView.h:

#import <UIKit/UIKit.h>

@interface CustomImageView : UIView
{
    UIImageView *imageView;
    UILabel *caption;
    UIActivityIndicatorView *activityIndicator;
}

@property (nonatomic, retain) UIImageView *imageView;
@property (nonatomic, retain) UILabel *caption;
@property (nonatomic, retain) UIActivityIndicatorView *activityIndicator;
@end

CustomImageView.m:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        caption = [[UILabel alloc] initWithFrame:CGRectMake(0, 250, 320, 50)];
        [caption setBackgroundColor:[UIColor greenColor]];
        imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 250)];
        [imageView setBackgroundColor:[UIColor blueColor]];
        activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
        self.activityIndicator.frame = CGRectMake(320/2-25, 460/2-25, 50, 50);
        [self.activityIndicator startAnimating];


        [self addSubview:self.caption];
        [self addSubview:self.imageView];
        [self addSubview:self.activityIndicator];
    }
    return self;
}

次に、前に行ったことをすべて実行します。それはより良い仕事をするでしょう

于 2012-07-24T10:57:12.523 に答える