문제

내가하고 우리 CALayers 로"스프라이트에서"아이폰 응용 프로그램에서 일하고 있어요.에서 내가 읽고,같이 보이는 올바른 것은 여기에.

때 나는 설정 레 내부 UIView 클래스 I am 을 얻을 수 있 레이어 화면에 표시:NSLog(@"GameView 등의 방법 세");

NSString* imagePath = [[NSBundle mainBundle] pathForResource:@"earth" ofType:@"png"];
earthImage = [[UIImage alloc] initWithContentsOfFile:imagePath];

earthLayer = [CALayer layer];
[earthLayer setContents:(id)[earthImage CGImage]];
[earthLayer setBounds:CGRectMake(0, 0, 32, 32)];
[earthLayer setPosition:CGPointMake(50, 50)];
[earthLayer setName:@"earth"];

[[self layer] addSublayer:earthLayer];

그러나려고 시도하면 초기화 CALayer 외부 UIView,내 응용 프로그램:

- (void)loadImage:(NSString*)fileName
{
  NSLog(@"GamePiece loadImage");
  NSArray* fileNameParts = [fileName componentsSeparatedByString:@"."];
  imageName = [[fileNameParts objectAtIndex:0] retain];
  NSString* ext = [fileNameParts objectAtIndex:1];

  NSString* imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:ext];
  image = [[UIImage alloc] initWithContentsOfFile:imagePath];

  layer = [CALayer layer];
  [layer setContents:(id)[image CGImage]];

  [layer setBounds:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)];
  [layer setPosition:CGPointMake(50.0f, 50.0f)];
  [layer setName:imageName];

  [fileNameParts release], fileNameParts = nil;
  [ext release], ext = nil;
}

NSLog(@"GameView initWithCoder");
earth = [[GamePiece alloc] init];
[earth loadImage:@"earth.png"];

[[self layer] addSublayer:[earth layer]];

분명히 내가 뭔가 잘못된 일을 해요 여기에,하지만 난 그냥 무엇인지 모르는 것입니다.I have read 핵심 애니메이션 프로그램 가이드 및 아이폰 응용 프로그램 프로그래밍 가이드,하지만 그들은 정말로 보이지 않는 방법에 대해 이야기하면 초기화 CALayer 이외에 전달합니다.

나는 그저 필요한 부드러운 찔러에 올바른 방향으로 이동합니다.있는 아주 좋은 이해에 대해 다른 모든 것을 배웠을 때에 관해서 프로그래밍 아이폰.나는 그냥 몇 가지 문제를 그래픽으로,레이어와 애니메이션이다.

사전에 감사합니다!

도움이 되었습니까?

해결책

당신이 소유하지 않는 레이어에서 얻 layer 방법,그래서 당신은 소유입니다.언젠가 후에 당신의 방법을 반환합 레이어는 할당 및 일으키는 귀하의 충돌이 발생합니다.이동:

layer = [[CALayer layer] retain]; // now we explicitly take ownership of this layer

또한,를 해제하는 것을 잊지 마세요 층 때문에 당신은 그것을 소유 지금:

// in your dealloc method
[layer release];

을 검토해야 합니다 메모리 관리 프로그래밍 가이드에 대한 코코아 에 대한 자세한 내용을 때 당신의 자신의 개체 및 책임에 관한 메모리를 관리합니다.

다른 팁

제이슨,당신은 당신이 응답!그러나 답하지 않는 것에 어떤 영향의 결과에 내 문제입니다.

실제로,"대답은"뭔가 메모리와 관련된 관리입니다.지 레지만,이름이 나가서 있기 때문입를 호출한 후에 componentsSeparatedByString:.하지 않는 경우에 놓 있기 때문입,코드의 잘 작동합니다.그래서 내가 만들 필요가의 복사본을@입 내부에 배열을 사용하는 대신 개체에 배열입니다.

내가 말을 하지 않는 메모리 관리 프로그래밍 가이드 코코아를위한 당신을 제안합니다.그러나 내가 읽은 여러 가지 다른 예약하는 이야기에 대한 기준에서 사용되는 코코아를 위해 만들어진 개체 및 그들의 유지를 계산합니다.나는 공정을 이해하지만,분명히,으로 좋지 않아 아직 필요하다.

나는 진짜로 의심을 가지고 있었는 문자열을 복사의 배열을,하지만 그것이에서 일했 UIView,나는 그냥 그것은 가정이 아니었다.문제,내가 그것을 유지하는 나처럼 내 GamePiece 개체입니다.

감사에 대한 적어도 나를 보고 올바른 방향으로!나는 정말에서 순발력을 끝으로 이 코드입니다.

하이 무엇을 원하고,여기에는 방법을 변경할 수 있습니다.에 loadImage: 사용이 라인에 추가 UIImage 당신이 로드 earth 층:

자체입니다.내용=이미지입니다.CGImage;

CALayerscontents 성할 수 있는 설정 CGImage 오히려 문제를 통해 사용하는 코어는 그래픽을 호출 이미지를 그릴으로 레이어의 컨텍스트입니다.

다음에 부모로 UIView 서브 클래스에 추가할 수 있습니다 earth view 계층 다음과 같다:

[자기.층 addSublayer:지구];

Note earth 자체가 CALayer 으로 이미지의 내용을 추가 직접적으로 하위.다른 것은,제가 항상 수행하는 것을 잊지 설정한 레이어 frame 을 제공합니다.그렇지 않으면 너비와 높이 될 것입니다 제게 보이지 않을 것이다.

코드에서 만든 레이어지 추가 레이어를 넣는 계층 구조로 구성됩니다.나무가있는 경우 전망(클래스 UIView)및 그 하위.트리의 루트가[}의 mainwindow](주는}의의 하위 클래스 UIView.각 UIViewlayer 객실 유형 CALayer 실제로 보유하고 표시되는 콘텐츠입니다. UIView 은 래퍼 CALayer 를 추가하는 것처럼 처리 터치 능력이 있습니다.

중요한 아이디어 당신은 여기에는 아무것도 볼 수 있도록 화면에서는 이 나무의 전망과 함께}의 뿌리고 모든 의견을 볼 수 있어야 합니다(i.e들 hidden 속성 NO 결)toplevel 창고층에서 질문입니다.그런 다음에는 레이어에서 볼 수 있는 화면입니다.그래서 어딘가에 코드를 추가할 필요가 당신의 계층으로 하위 레이어의 무언가를 이미 표시를 호출하여 addSublayer:.

귀하의 경우에,나는 가정 earth 의 인스턴스 CALayer 고 무엇을 했는지 내 loadImage: 방법은 새로 생성 CALayer (청 [CALayer layer])내 earth 층 하지만 당신은 결코 추가하는 새로운 레이어를 아무것도하지 않을 수 있도록 되었다 볼 수 있습니다.당신이 무엇을 했는지 대신한 시도 추가 earth 층에는 여전히지 않는 어떤 콘텐츠,내가 무엇을 가정 UIView's 층

[[자기 레이어]addSublayer:[지구 층]];

문제 중 하나 이 라인은 당신을 생각할 layer 호텔 earth.실제로 layer 는 클래스 메소드의 CALayer 는 공장 만드는 방법의 새 인스턴스 CALayer.이것은 혼란 때문에 [self layer] 실제로에 액세스하는 레이어의 속성 UIView 인스턴스입니다.(나는 가정 self 을 참조하의 인스턴스 UIView 서브 클래스.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top