您好Iam与Iphone Photo Library合作。我从AssetFramework的照片库中获得了所有照片。我在滚动视图中显示这些照片并且完美显示并且图像计数假定为6.然后当我点击单个图像时,它将显示大图像。它也完成了。我的问题是“当点击图像显示为大数时,计数为12(重复计数)。”
我使用下面的代码来获取图片:
- (void)createScrollView
{
@try
{
NSLog(@"in create scrollview");
//add views to scrolview
// UIImageView *backgroundImgView;
int x=5;
int y=7;
NSLog(@"assetsArray/count/createScrollview %d",assetsArray.count);
for (int i=0;i<[assetsArray count];i++)
{
UIView *userView=[[UIView alloc] initWithFrame:CGRectMake(x, y, 70, 80)];
userView.tag=i;
UIImageView *backgroundImgView=[[UIImageView alloc] initWithFrame:CGRectMake(1, 1, 70, 70)];
backgroundImgView.tag=1;
// [backgroundImgView setImageWithURL:[NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF16BigEndianStringEncoding]] placeholderImage:[UIImage imageNamed:@"NoImage.png"]];
//-------------Getting Images from AssetsLibrary ----------
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
galleryObj=[[GalleryObject alloc]init];
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
UIImage *assetsLibraryImage;
if (iref)
{
assetsLibraryImage = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:(UIImageOrientation)[rep orientation]];
galleryObj.galleryImage=assetsLibraryImage;
}
else
{
assetsLibraryImage = [UIImage imageNamed:@"NoImage.png"];
}
//[set addObject:[NSString stringWithFormat:@"1"]];
[uniqueSet addObject:galleryObj];
NSLog(@"uniqueSet data is .....%@",uniqueSet); // Output (3,1,4,2,5) ... all objects
[imagesArray addObject:galleryObj];
NSLog(@"imagesArray/resultBlock count is %d array is %@....",imagesArray.count,imagesArray);
backgroundImgView.image=assetsLibraryImage;
};
ALAsset *al_asset = [assetsArray objectAtIndex:i];
//NSLog(@"al_asset is ......%@",al_asset);
al_assetUrl=al_asset.defaultRepresentation.url;
//NSLog(@"al_assetUrl is %@",al_assetUrl);
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
NSLog(@"ALAssetsLibraryAccessFailureBlock");
};
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:al_assetUrl resultBlock:resultblock failureBlock:failureblock];
//-------------Getting Images from AssetsLibrary ----------
UIButton *userButton=[[UIButton alloc]initWithFrame:CGRectMake(1, 1, 70,70)];
[userButton addTarget:self action:@selector(userImageClicked:) forControlEvents:UIControlEventTouchUpInside];
userButton.tag=i;
[userView addSubview:backgroundImgView];
[userView addSubview:userButton];
[self.galleryScrollview addSubview:userView];
x+=79;
if ((i+1)%4==0)
{
//if added image is 4th image
y+=80;
x=5;
}
// [activity stopAnimating];
}
if (y+100>self.galleryScrollview.frame.size.height)
{
self.galleryScrollview.contentSize=CGSizeMake(320, y+100);
}
else
{
self.galleryScrollview.contentSize=CGSizeMake(320, self.galleryScrollview.frame.size.height+60);
}
}
@catch (NSException *exception)
{
NSLog(@"exception is %@",exception);
}
}
请注意我在上面的方法中创建了按钮和动作是userImageClicked。当我点击userImageClicked按钮时,数组计数是双倍的。
我不知道为什么会这样。我尝试使用containsObject方法删除重复项。但没用。
在上述方法中,我将UIImage
保存在objectclass
中,并将该对象分配给imagesArray
。
我还将NSMutableSet
用于存储值,但它也没用。
请任何人建议解决我的问题。
答案 0 :(得分:1)
这是删除重复数据的方法:
NSArray *copy = [mutableArray copy];
NSInteger index = [copy count] - 1;
for (id object in [copy reverseObjectEnumerator]) {
if ([mutableArray indexOfObject:object inRange:NSMakeRange(0, index)] != NSNotFound) {
[mutableArray removeObjectAtIndex:index];
}
index--;
}
请相应地使用它......
更简单的方法:
NSMutableArray *unique = [NSMutableArray array];
for (id obj in originalArray) {
if (![unique containsObject:obj]) {
[unique addObject:obj];
}
}
答案 1 :(得分:0)
如果上面是将图像添加到imagesArray
的唯一方法,那么请尝试检查您是否从任何位置调用了两次,否则请检查imagesArray
是否未从其他任何位置更新。
如果您需要多次调用此方法createScrollView
,请编写代码以分别在imagesArray
中添加图片。
答案 2 :(得分:0)
问题在于galleryObj
的创建。
您为每个图像创建一个新对象。
因此,galleryObj
的每个实例都是唯一的。
无论你使用NSM of NSMutableArray还是NSWhatever,他们都不会知道里面 galleryObj
对象是同一个UIImage。
ALAssetRepresentation
的Apple documentation声明它封装了一个表示形式。因此,如果同时保存了JGP和RAW图片,您将获得同一图片的两个单独的表示。
在这种情况下,您必须忽略一种或另一种类型。我不建议将RAW图片与JPG图片(; - )进行比较。
答案 3 :(得分:0)
嗨感谢所有人的快速回复。 3个小时后我解决了我的问题。我得到了完全相同的副本,因此我使用下面的代码删除了重复项。我知道这不是好代码。但它解决了我的问题。
if([imagesArray count]>0)
{
int dupCount=[imagesArray count]/2;
int imagesArrayCount=[imagesArray count];
for(int i=dupCount;dupCount<imagesArrayCount;dupCount++)
{
[imagesArray removeObjectAtIndex:i];
}
}
我也找到了重复数据的原因?答案是我使用了块码,它正在调用两次。这样该数组包含双数据值。
谢谢大家..