1

我可以将 NSImages 添加到我的 NSCollectionView 中,而无需先将它们保存在磁盘上。图像从 NSMutableArray 馈送到集合视图中。这样人们就可以看到图像而无需先保存它们。

我可以使用 IKImageBrowserView 实现类似的功能吗?NSCollectionView 在表示图像时很有用,但我想看看我是否可以用 IKImageBrowserView 做类似的事情。

我可以使用保存在磁盘上的图像轻松实现 IKImageBrowserView(Apple 文档介绍了它是如何工作的),但无法确切地知道在哪里查看或如何直接从 NSMutableArray 将图像添加到浏览器视图,而不是先将图像保存到磁盘.

我在这里不知所措。除了文档,我真的不确定在哪里寻找方向。或者我什至可以称之为我想要做的事情。

编辑:(这是一些代码)

// 数据对象——如果可以表示图像对象,这就是我可能出错的地方。

@interface ImageObject : NSObject

@property (readwrite, copy) NSImage *image;
@property (readwrite, copy) NSString *imageID;

- (id)initWithImage:(NSImage *)anImage;

- (NSString *)imageUID;
- (NSString *)imageRepresentationType;
- (id)imageRepresentation;

@end

@implementation ImageObject

@synthesize image = _image;
@synthesize imageID = _imageID;

- (id)initWithImage:(NSImage *)anImage
{
    if (self = [super init]) {
        _image = [anImage copy];
    }
    return self;
}

- (NSString *)imageUID
{
    return _imageID;
}

- (NSString *)imageRepresentationType
{
    return IKImageBrowserNSImageRepresentationType;
}

- (id)imageRepresentation
{
    return _image;
}

@end

// 这就是将对象添加到 browserView 的方式。所有这些都直接来自苹果。

- (void)updateDatasource
{
    [_browserImages addObjectsFromArray:_importedImages];
    [_importedImages removeAllObjects];
    [imageBrowser reloadData];
}

- (NSUInteger)numberOfItemsInImageBrowser:(IKImageBrowserView *)aBrowser
{
    return [_browserImages count];
}

- (id)imageBrowser:(IKImageBrowserView *)aBrowser itemAtIndex:(NSUInteger)index
{
    return [_browserImages objectAtIndex:index];
}

这是我尝试将 NSImages 添加到 browserView 但没有任何反应的地方。数组被填充(这意味着图像生成时没有任何错误)但屏幕上没有任何反应。

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[oPanel URL] options:nil];

NSMutableArray *timesArray = [self generateTimeForSpecifiedNumberOfFramesInVideo:10 UsingAsset:asset];

self.imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];

[[self imageGenerator] generateCGImagesAsynchronouslyForTimes:timesArray completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {

   NSImage *testImage = [[NSImage alloc] initWithCGImage:image size:NSZeroSize];

   if (result == AVAssetImageGeneratorSucceeded) {
       ImageObject *objects = [[ImageObject alloc] initWithImage:testImage];
       [_importedImages addObject:objects];
   }
}

至于探索其余的搜索结果......在那里做过。如果我确实遗漏了任何内容,请将此问题标记为重复,以表明已解决此问题的帖子。

编辑:

我已经接受了下面的答案。以及唯一 ID 问题。我忽略了一个简单的事情,即调用 updateDatasource 方法的要求。

4

1 回答 1

1

使用 IKImageBrowser 最重要的一点是为每个元素创建一个唯一的图像 ID。下面是一个例子。事实上,它来自我目前正在进行的项目。我刚刚在其中实现了 IKImageBrowser。下面的代码假设您有 36 张图像(Image01.png、Image02.png...、Image36.png)导入到项目中。

// .h
@interface AppDelegate : NSObject {
    IBOutlet IKImageBrowserView *browserView;
    NSMutableArray *imageArray;
}

// .m
#import "IKBBrowserItem.h"
#import <QuartzCore/QuartzCore.h>

- (void)applicationWillFinishLaunching:(NSNotification *)notification {
    imageArray = [[NSMutableArray alloc]init];
}

- (void)populateImage {    
    for (NSInteger i2 = 1; i2 <= 36 ; i2++) {
        NSString *name;
        if (i2 < 10) {
            name = [NSString stringWithFormat:@"Image0%ld",(long)i2];
        } else {
            name = [NSString stringWithFormat:@"Image%ld",(long)i2];
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        NSImage *Image0 = [NSImage imageNamed:name];
        NSInteger ran = [self genRandom:1000000:9999999];
        NSString *imageID = [NSString stringWithFormat:@"%@%li",name,ran];
        IKBBrowserItem *item = [[IKBBrowserItem alloc] initWithImage:Image0 imageID:imageID:name];
        [imageArray addObject:item];
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    }

    [browserView reloadData];
}

- (NSInteger)genRandom: (NSInteger)min :(NSInteger)max {
    int num1;
    do {
        num1 = arc4random() % max;
    } while (num1 < min);
    return num1;
}

您不需要使用上面的随机整数生成器 (genRandom),但只需确保没有 imageID 相同。

该网站有一个示例项目,应该可以帮助您进行。(我没有隶属关系。)所以请确保您下载并运行它。然后仔细查看并根据您的需要进行改进。

于 2013-09-07T23:39:23.460 回答