의 이름을 읽을 수 있습니까? UIImageView's
UIImage
현재 저장된의UIImageView
있습니까?
당신이 이런 일을 할 수 있기를 바랐지만 아직 알아 내지 못했습니다.
NSString *currentImageName = [MyIImageView getFileName];
의 이름을 읽을 수 있습니까? UIImageView's
UIImage
현재 저장된의UIImageView
있습니까?
당신이 이런 일을 할 수 있기를 바랐지만 아직 알아 내지 못했습니다.
NSString *currentImageName = [MyIImageView getFileName];
답변:
아니. 당신은 그렇게 할 수 없습니다.
그 이유는 UIImageView
인스턴스가 이미지 파일을 저장하지 않기 때문입니다 . 디스플레이 UIImage
인스턴스를 저장 합니다. 파일에서 이미지를 만들 때 다음과 같이합니다.
UIImage *picture = [UIImage imageNamed:@"myFile.png"];
이 작업이 완료되면 더 이상 파일 이름에 대한 참조가 없습니다. UIImage
인스턴스는 관계없이 그것을 가지고 어디에 데이터가 포함되어 있습니다. 따라서 UIImageView
파일 이름을 알 수 없습니다.
또한 가능하더라도 뷰에서 파일 이름 정보를 얻을 수 없습니다. 그것은 MVC를 깨뜨립니다.
UIView의 모든 하위 클래스에 setAccessibilityIdentifier 메서드를 사용할 수 있습니다.
UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;
NSString *file_name = [image accessibilityIdentifier] ;
localize
단순히 이미지를 통과하고 이미지 이름에 대한 정규식을 수행 하는 방법 을 만들고 싶다 (그것을 만드는 아주 좋은 이유가있다. 사용자 정의 UIImage를 만드는 대신 실제 이미지 이미지) .. 모두가 MVC에 대해 이야기하고 있기 때문에
accessibilityDescription
아니오 아니오 아니오… 일반적으로 이러한 일이 가능합니다. 그것은 당신을 더러운 사람처럼 느끼게 할 것입니다. 꼭 필요한 경우 다음을 수행하십시오.
+imageNamed:(NSString*)imageName
기존 구현에 대한 호출 의 자체 구현으로 범주를 만들고 여기에 식별 된 기술 ( 개체 내에서 objc_setAssociatedObject / objc_getAssociatedObject를 사용하는 방법 )을 imageName
사용하여 반환 된 UIImage 개체와 영구적으로 연결 합니다.
Objective-C 런타임의 메서드 조회 테이블에서 구현에 대해 제공된 구현을 바꾸려면 메서드 전환을 사용 imageNamed:
합니다.
원할 때마다 UIImage 인스턴스 (objc_getAssociatedObject 사용)와 연결 한 이름에 액세스합니다.
NIB에로드 된 UIImage의 이름을 가져올 수 없다는 경고와 함께 이것이 작동하는지 확인할 수 있습니다. NIB에서로드 된 이미지는 표준 함수 호출을 통해 생성되지 않는 것 같아서 정말 미스테리입니다.
구현은 귀하에게 맡기겠습니다. Objective-C 런타임을 사용하여 코드를 복사하여 붙여 넣는 것은 매우 나쁜 생각이므로 프로젝트의 요구 사항에 대해 신중하게 생각하고 필요한 경우에만 구현하십시오.
UIImage
메서드를 재정의하기 위해의 하위 클래스를 만드는 것이 어떻습니까?
+imageNamed:(NSString*)imageName { // save file name in new property or whatever [self imageNamed:imageName]; // infinite loop [super imageNamed:imageName]; // super doesn't contain such a method }
이를 수행하는 고유 한 방법은 없습니다. 그러나이 동작을 직접 쉽게 만들 수 있습니다.
하위 클래스 UIImageView
를 만들고 새 인스턴스 변수를 추가 할 수 있습니다 .
NSString* imageFileName;
그런 다음을 재정의 setImage
하고 먼저 설정 imageFileName
중인 이미지의 파일 이름을 설정 한 다음 [super setImage:imageFileName]
. 이 같은:
-(void) setImage:(NSString*)fileName
{
imageFileName = fileName;
[super setImage:fileName];
}
기본적으로 할 수 없다고해서 불가능하다는 의미는 아닙니다. :)
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{
}
hot dog
또는 not hotdog
.
UIImage가 아닌 UIImageView는로드 된 이미지의 파일 이름을 보유하지 않습니다.
당신은
1 : (위의 Kenny Winker가 제안한대로) 하위 클래스 UIImageView가 fileName 속성을 갖거나
2 : 숫자 (image1.jpg, image2.jpg 등)로 이미지 파일의 이름을 지정하고 해당 번호 (image1.jpg의 경우 tag = 1, image2.jpg의 경우 tag = 2 등)로 이미지에 태그를 지정하거나
3 : UIImageView의 이미지를 업데이트 할 때마다 업데이트되는 클래스 수준 변수 (예 : NSString * currentFileName)가 있습니다.
이 코드는 당신을 도울 것입니다 :-
- (NSString *)getFileName:(UIImageView *)imgView{
NSString *imgName = [imgView image].accessibilityIdentifier;
NSLog(@"%@",imgName);
return imgName;
}
이것을 다음과 같이 사용하십시오.
NSString *currentImageName = [self getFileName:MyIImageView];
[image setAccessibilityIdentifier:@"demoFileName.png"] ;
이 방법 다음 호출
또는 다음과 같이 복원 식별자를 사용할 수 있습니다.
let myImageView = UIImageView()
myImageView.image = UIImage(named: "anyImage")
myImageView.restorationIdentifier = "anyImage" // Same name as image's name!
// Later, in UI Tests:
print(myImageView.restorationIdentifier!) // Prints "anyImage"
기본적으로이 솔루션에서는 복원 식별자를 사용하여 이미지의 이름을 유지하므로 나중에 어디서나 사용할 수 있습니다. 이미지를 업데이트하는 경우 다음과 같이 복원 식별자도 업데이트해야합니다.
myImageView.restorationIdentifier = "newImageName"
도움이 되었기를 바랍니다. 행운을 빕니다!
예 아래 코드와 같은 데이터의 도움으로 비교할 수 있습니다.
UITableViewCell *cell = (UITableViewCell*)[self.view viewWithTag:indexPath.row + 100];
UIImage *secondImage = [UIImage imageNamed:@"boxhover.png"];
NSData *imgData1 = UIImagePNGRepresentation(cell.imageView.image);
NSData *imgData2 = UIImagePNGRepresentation(secondImage);
BOOL isCompare = [imgData1 isEqual:imgData2];
if(isCompare)
{
//contain same image
cell.imageView.image = [UIImage imageNamed:@"box.png"];
}
else
{
//does not contain same image
cell.imageView.image = secondImage;
}
이미지 이름을 UImageView와 연결하기 위해 객관적인 c 런타임 기능을 사용할 수 있습니다.
#import <objc/runtime.h>
수업에서 먼저 가져 오기
그런 다음 아래와 같이 코드를 구현하십시오.
NSString *filename = @"exampleImage";
UIImage *image = [UIImage imagedName:filename];
objc_setAssociatedObject(image, "imageFilename", filename, OBJC_ASSOCIATION_COPY);
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
//You can then get the image later:
NSString *filename = objc_getAssociatedObject(imageView, "imageFilename");
도움이되기를 바랍니다.
이미지 이름 Swift 4.2 가져 오기
자산에있는 버튼 이미지 이름을 비교하려는 경우 방법이 있습니다.
@IBOutlet weak var extraShotCheckbox: UIButton!
@IBAction func extraShotCheckBoxAction(_ sender: Any) {
extraShotCheckbox.setImage(changeCheckBoxImage(button: extraShotCheckbox), for: .normal)
}
func changeCheckBoxImage(button: UIButton) -> UIImage {
if let imageView = button.imageView, let image = imageView.image {
if image == UIImage(named: "checkboxGrayOn") {
return UIImage(named: "checkbox")!
} else {
return UIImage(named: "checkboxGrayOn")!
}
}
return UIImage()
}
스위프트 3
먼저 accessibilityIdentifier를 imageName으로 설정하십시오.
myImageView.image?.accessibilityIdentifier = "add-image"
그런 다음 다음 코드를 사용하십시오.
extension UIImageView
{
func getFileName() -> String? {
// First set accessibilityIdentifier of image before calling.
let imgName = self.image?.accessibilityIdentifier
return imgName
}
}
마지막으로 식별하는 방법의 호출 방법
myImageView.getFileName()
나는이 문제를 다루었 고 MVC 디자인 패턴으로 해결했으며 Card 클래스를 만들었습니다.
@interface Card : NSObject
@property (strong,nonatomic) UIImage* img;
@property (strong,nonatomic) NSString* url;
@end
// 다음에 수행 UIViewController
할 DidLoad
메서드에서 :
// init Cards
Card* card10= [[Card alloc]init];
card10.url=@"image.jpg";
card10.img = [UIImage imageNamed:[card10 url]];
// 예
UIImageView * myImageView = [[UIImageView alloc]initWithImage:card10.img];
[self.view addSubview:myImageView];
// 이미지 이름을 확인하고 싶을 수 있으므로 다음과 같이 할 수 있습니다.
// 예 :
NSString * str = @"image.jpg";
if([str isEqualToString: [card10 url]]){
// your code here
}
코드는 swift3에서 작동합니다-didFinishPickingMediaWithInfo 델리게이트 메서드 내부에 코드를 작성합니다.
if let referenceUrl = info[UIImagePickerControllerReferenceURL] as?
NSURL {
ALAssetsLibrary().asset(for: referenceUrl as URL!, resultBlock: { asset in
let fileName = asset?.defaultRepresentation().filename()
print(fileName!)
//do whatever with your file name
}, failureBlock: nil)
}