원형 이미지 경로에서 이미지보기를 클릭하고 이미지보기에서 새 이미지를 변경하는 데 필요한 이미지를 클릭하여 애니메이션으로 만듭니다. 내 문제는 이미지 뷰에 할당 된 이미지가 할당 취소되지 않는다는 것입니다. 그리고 애플 리케이션 메모리 경고를 받고 추락. 나는이 문제에 대한 많은 해결책을 서핑하고 시도했지만 사용하지는 않았다. 제 경우에는 Objective 클래스에서 모든 UI 구성 요소를 작성해야합니다. 이미지보기와 애니메이션을 만들기위한 코드를 게시하고 있습니다.iOS UIImageView 메모리가 ARC에서 할당 해제되지 않음
@autoreleasepool {
for(int i= 0 ; i < categories.count; i++)
{
NSString *categoryImage = [NSString stringWithFormat:@"%@_%ld.png",[categories objectAtIndex:i],(long)rating];
if (paginationClicked) {
if([selectedCategories containsObject:[categories objectAtIndex:i]]){
categoryImage = [NSString stringWithFormat:@"sel_%@",categoryImage];
}
}
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = [self.mySprites objectForKey:categoryImage];
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.clipsToBounds = NO;
[imageView sizeToFit];
imageView.accessibilityHint = [categories objectAtIndex:i];
// imageView.frame = CGRectMake(location.x+sin(M_PI/2.5)*(self.view.frame.size.width*1.5),location.y+cos(M_PI/2.5)*(self.view.frame.size.width*1.5) , 150, 150);
imageView.userInteractionEnabled = YES;
imageView.multipleTouchEnabled = YES;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(categoryTapGestureCaptured:)];
singleTap.numberOfTapsRequired = 1;
[imageView addGestureRecognizer:singleTap];
[categoryView addSubview:imageView];
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
UIBezierPath *path = [UIBezierPath bezierPath];
[path addArcWithCenter:location
radius:self.view.frame.size.width*1.5
startAngle:0.8
endAngle:-0.3+(0.1*(i+1))
clockwise:NO];
animation.path = path.CGPath;
imageView.center = path.currentPoint;
animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
animation.duration = 1+0.25*i;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
// Apply it
[imageView.layer addAnimation:animation forKey:@"animation.trash"];
}
}
그리고 이것은 클릭 할 때 이미지를 변경하는 코드입니다.
for (UIImageView *subview in subviews) {
NSString *key = [NSString stringWithFormat:@"%@_%ld.png",subview.accessibilityHint,(long)rating];
if ([SelectedCategory isEqualToString:subview.accessibilityHint]) {
NSString *tempSubCategory = [categoryObj objectForKey:SelectedCategory];
if([selectedCategories containsObject:SelectedCategory]){
subview.image = [self.mySprites objectForKey:key];
[selectedCategories removeObject:SelectedCategory];
if (tempSubCategory.length != 0) {
subCategoriesAvailable = subCategoriesAvailable-1;
}
[self showNoPagination:subCategoriesAvailable+2];
}else{
if(selectedCategories.count != 2){
key = [NSString stringWithFormat:@"sel_%@",key];
subview.image = [self.mySprites objectForKey:key];
[selectedCategories addObject:SelectedCategory];
if ([SelectedCategory isEqualToString:@"Other"]) {
[self showCommentDialog];
}else{
if (tempSubCategory.length != 0) {
subCategoriesAvailable = subCategoriesAvailable+1;
}
[self showNoPagination:subCategoriesAvailable+2];
}
}
}
[self disableCategories];
break;
}
}
그리고 내가 무엇을 잘못하고 있는지 알지 못합니다. for 루프에서 무효화를 시도했지만 사용하지 않았습니다. 이 문제를 해결하기 위해 내가 참조 용 이미지보기
UIView *categoryView = [self.view viewWithTag:500];
NSArray *subviews = [categoryView subviews];
for (UIImageView *subview in subviews) {
if(![selectedCategories containsObject:subview.accessibilityHint]){
[subview removeFromSuperview];
subview.image = Nil;
}
}
에게 추가 스프라이트 리더 코드를 제거하기 위해 사용
코드
#import "UIImage+Sprite.h"
#import "XMLReader.h"
@implementation UIImage (Sprite)
+ (NSDictionary*)spritesWithContentsOfFile:(NSString*)filename
{
CGFloat scale = [UIScreen mainScreen].scale;
NSString* file = [filename stringByDeletingPathExtension];
if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
(scale == 2.0))
{
file = [NSString stringWithFormat:@"%@@2x", file];
}
NSString* extension = [filename pathExtension];
NSData* data = [NSData dataWithContentsOfFile:[NSString stringWithFormat:@"%@.%@", file,extension]];
NSError* error = nil;
NSDictionary* xmlDictionary = [XMLReader dictionaryForXMLData:data error:&error];
NSDictionary* xmlTextureAtlas = [xmlDictionary objectForKey:@"TextureAtlas"];
UIImage* image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@.%@", file,[[xmlTextureAtlas objectForKey:@"imagePath"]pathExtension]]];
CGSize size = CGSizeMake([[xmlTextureAtlas objectForKey:@"width"] integerValue],
[[xmlTextureAtlas objectForKey:@"height"] integerValue]);
if (!image || CGSizeEqualToSize(size, CGSizeZero)) return nil;
CGImageRef spriteSheet = [image CGImage];
NSMutableDictionary* tempDictionary = [[NSMutableDictionary alloc] init];
NSArray* xmlSprites = [xmlTextureAtlas objectForKey:@"sprite"];
for (NSDictionary* xmlSprite in xmlSprites)
{
CGRect unscaledRect = CGRectMake([[xmlSprite objectForKey:@"x"] integerValue],
[[xmlSprite objectForKey:@"y"] integerValue],
[[xmlSprite objectForKey:@"w"] integerValue],
[[xmlSprite objectForKey:@"h"] integerValue]);
CGImageRef sprite = CGImageCreateWithImageInRect(spriteSheet, unscaledRect);
// If this is a @2x image it is twice as big as it should be.
// Take care to consider the scale factor here.
[tempDictionary setObject:[UIImage imageWithCGImage:sprite scale:scale orientation:UIImageOrientationUp] forKey:[xmlSprite objectForKey:@"n"]];
CGImageRelease(sprite);
}
return [NSDictionary dictionaryWithDictionary:tempDictionary];
}
@end
제발 도와주세요. 미리 감사드립니다.
이미지 뷰를 카테고리 뷰에 추가하지만 하위 뷰에서 제거 하시겠습니까 ?? 이 subviews은 무엇입니까. 그리고 표시된 코드에서 이미지를 제거하는 위치는 어디입니까 ?? – Janmenjaya
NSArray를 사용하고 있습니다 * subviews = [[self.view viewWithTag : 500] subviews]; 카테고리보기의 모든 하위보기를 가져오고 탭 제스처가 감지 된 이미지를 변경합니다. – ponraj
좋아, 그럼 어디 이미지를 제거하고, 나는 당신이 배열에서 개체를 제거하는 것을 볼 수 있습니다. imageView.image = nil; [imageview removeFromSupreView]와 같은 이미지 및 imageView를 제거하는 코드는 어디에 있습니까? 매번 당신을 도청하는 동안 매번 imageView를 할당하는 것 같아요. 그렇다면 다시 할당하기 전에 이미지를 nil로 만들고 supreView에서 imageView를 제거하십시오. 나는 정확하게 추측 했느냐? – Janmenjaya