2013-04-02 3 views
1

:이 상관없이 화면에 내 이미지의 위치를 ​​업데이트하지setNeedsDisplay 혼란

-(void) moveImage:(CADisplayLink *)sender{ 
    CGPoint img; 
    imgLocation = imgImageView.center; 
    if (img < 100) { 
     img.y++; 
    } 
    else{ 
     imgLocation.y = 0; 
    } 
    imgImageView.center = imgLocation;  
} 

:

meteorDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(moveImage:)]; 

여기 내 moveImage: 방법이다. setNeedsDisplay은 왜 여기에 영향을 미치지 않습니까? setNeedsDisplay의 요점은 무엇입니까?

+0

이것은 메소드가 아니라 함수입니다. – matt

+1

코드에'setNeedsDisplay'가 없습니다. – matt

+0

setNeedsDisplay는 imgImageView.center = imgLocation 다음에 있어야합니다. 내가 그걸로 놀고있을 때 나는 그것을 꺼냈다. 그러나 내가 그것을 제거했다고 말한 곳이있다. 감사! – mskw

답변

3

imgImageViewUIImageView의 인스턴스라고 가정합니다. 이 아니고 인스턴스가 UIImageView 인 경우 질문을 편집하여 내용을 알려주십시오.

보기의 center 속성을 변경하면 앱에서보기를 다시 그릴 필요가 없습니다. 디스플레이 서버 (iOS 6의 backboardd 및 이전 버전의 springboard이라는 개별 프로세스)에는보기의 픽셀 데이터 사본이 이미 있습니다. 뷰의 center을 변경하면 뷰는 디스플레이 서버에 새 위치를 알리고 디스플레이 서버는 뷰의 픽셀 데이터를 화면의 해당 부분에 복사합니다.

따라서보기의 center 속성을 변경하면 setNeedsDisplay을 보내지 않아도됩니다.

보다 구체적으로는 UIImageViewdrawRect:을 구현하지 않습니다. 대신 UIImageView은 이미지를 설정할 때 디스플레이 서버에 이미지의 픽셀 데이터를 보냅니다. 따라서 setNeedsDisplayUIImageView에 보내더라도 여전히 drawRect: 메소드가 실행되지 않습니다.

는 그건 그렇고, 당신은 대신 drawRect:을 구현하는 CGImageRefself.layer.contents를 설정하여도 자신의 UIView 서브 클래스에서이 작업을 수행 할 수 있습니다. 이 작업을 수행하려면 #import <QuartzCore/QuartzCore.h>해야합니다. 물론 UIImageView도 애니메이션 및 크기 조절이 가능한 이미지 처리와 같은 다른 작업을 수행합니다.

+1

매우 흥미 롭습니다. 나는 이것 모두를 몰랐습니다. +1 – borrrden

+0

그래, 내가 몰랐던 깊은 통찰력이야. – mskw

1

개체의 레이아웃에 영향을주는 속성을 설정하면 setNeedsDisplay이 내부적으로 호출됩니다. 자동으로 호출하지 않는 사용자 정의 속성 등을 위해 직접 호출해야합니다.

1

setNeedsDisplay는 레이어 또는 뷰의 내용에만 적용됩니다. 즉, 뷰의 내용이 변경되어 다시 그려야하는 경우 setNeedsDisplay를 사용하여 뷰를 다시 그려야하고 drawRect 메서드를 트리거해야한다고 설명합니다.

위치, 크기 및 회전 등과 같은보기의 변환은 GPU에서 직접 처리하므로보기를 다시 그릴 필요가 없습니다. 따라서 단순히 뷰를 이동하거나 변형 할 때 setNeedsDisplay가 적용되지 않습니다.