2010-12-09 6 views
4

내 목표는 간단합니다. UIImage를 표시하는 프로그램을 만들고 싶습니다. 아래에서 위로 스 와이프하면 다른 UIImage가 표시됩니다. 여기 이미지는 행복한 얼굴/슬픈 얼굴이 될 수 있습니다. 슬픈 얼굴은 출발점, 행복한 얼굴은 끝점이어야합니다. 손가락을 스 와이프 할 때 손가락 아래의 부분은 행복한 얼굴을 나타내야합니다.경계 및 프레임 : UIImage의 일부를 표시하는 방법

지금까지 나는 프레임과 UIImageview의 속성을 해피 한 얼굴 이미지로 사용하여이 문제를 해결하려고 노력했습니다.

전환이 화면 중앙에서 시작되고 아래쪽에서 시작되기 때문에이 코드의 내용은 잘못되었습니다. 프레임과 경계 모두의 원점은 0,0 ...

프레임과 경계에 대한 수많은 페이지를 읽었지만 이해하지 못합니다. 어떤 도움을 주셔서 감사합니다!

로드 이미지는 한 번만 호출됩니다.

- (void)loadImages { 
    sadface = [UIImage imageNamed:@"face-sad.jpg"]; 
    happyface = [UIImage imageNamed:@"face-happy.jpg"]; 
    UIImageView *face1view = [[UIImageView alloc]init]; 
    face1view.image = sadface; 
    [self.view addSubview:face1view]; 

    CGRect frame; 
    CGRect contentRect = self.view.frame; 
    frame = CGRectMake(0, 0, contentRect.size.width, contentRect.size.height); 
    face1view.frame = frame; 
    face2view = [[UIImageView alloc]init]; 
    face2view.layer.masksToBounds = YES; 
    face2view.contentMode = UIViewContentModeScaleAspectFill; 
    face2view.image = happyface; 
    [self.view addSubview:face2view]; 
    frame = CGRectMake(startpoint.x, 0, contentRect.size.width, contentRect.size.height); 
    face2view.frame = frame; 
    face2view.clipsToBounds = YES; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint movepoint = [[touches anyObject] locationInView: self.view]; 
    NSLog(@"movepoint: %f %f", movepoint.x, movepoint.y); 
    face2view.bounds = CGRectMake(0, 0, 320, 480 - movepoint.y); 
} 

dealloc 함수에는 UIImages 및 UIImageViews가 적절하게 처리됩니다.

답변

0

문제는 touchesMoved의 face2view.bounds와 관련이있는 것으로 보입니다. 넌 X는 RECT이보기의 경계를 설정하고 : 0, Y : 0, 폭 : 320, 높이 : 480 - x 축

Y 왼쪽 Y

X = 0 == = 0 == y 축상의 상단

그래서이 이미지 프레임을 왼쪽 상단 모서리에 놓고 전체보기를 채 웁니다. 그것은 당신이 원하는 것이 아닙니다. 이미지는이 이미지 뷰의 중앙에 배치됩니다.

+0

나는 왼쪽 상단 모서리에 이미지 프레임을 넣어야한다고 생각해. 이미지가 겹쳐 져야하기 때문입니다 (동일한 이미지이므로 다른 곳에 놓으면 행복한 얼굴이 슬픈 얼굴로 움직입니다). 행복한 얼굴을 보여줄 수있는 길이 있습니까? –

+0

내가 무슨 뜻인지 이해가 잘 모르겠다. 다른 방식으로 설명 할 수 있습니까? – Allyn

+0

이미지가 서로 위에 있어야합니다. 웃는 입과 슬픈 입을 제외하고는 이미지가 거의 동일하기 때문입니다. 전환이 발생하면 전체 이미지가 한 곳에 머물러 있어야합니다. 입만 슬픈 것에서 행복하게 된 것 같습니다. 이것을 얻으려면 두 이미지가 모두 0,0에서 시작해야합니다. 이는 두 이미지 모두 0,0에서 320,480까지의 프레임을 가짐을 의미합니다. –

2

실제로 프레임과 경계가 혼동스러워 보입니다. 사실 쉽습니다. 모든 뷰에는 자체 좌표계가 있음을 항상 기억하십시오. 프레임, 중심 및 변형 속성은 수퍼 뷰의 좌표로 표현되는 반면 경계는 뷰 자체의 좌표계로 표현됩니다. 뷰에 수퍼 뷰가 아직없는 경우 (뷰 계층에 아직 설치되지 않음) 여전히 프레임이 있습니다. iOS에서 프레임 속성은 뷰의 경계, 중심 및 변형에서 계산됩니다. 수퍼바이저가 없을 때 지옥의 틀과 중심이 무슨 뜻인지 물어볼 수 있습니다. 뷰를 다른 뷰에 추가 할 때이 뷰가 사용되어 실제 뷰가 표시되기 전에 뷰의 위치를 ​​지정할 수 있습니다.

뷰의 경계가 프레임과 다른 경우 가장 일반적인 예는 슈퍼 뷰의 왼쪽 상단 모서리에없는 경우입니다. bounds.origin은 CGPointZero이고 frame.origin은 그렇지 않을 수 있습니다. 또 다른 고전적인 예가 UIScrollView입니다. UIScrollView는 서브 프레임을 스크롤 (실제로 프레임에 영향을주지 않고 좌표계의 원점을 수정하면 모든 서브 뷰를 자동으로 이동 함)하는 자체 프레임을 유지하면서 바운더리를 수정합니다.

코드로 돌아 가기. 우선, 이미 이미지 뷰에 표시 할 이미지가있을 때, 그것은 자신의 이미지 뷰를 초기화하기 위해서 의미가 있습니다 : 이미지보기로 제대로 바로 크기 자체를하는 데 도움이

UIImageView *face1view = [[UIImageView alloc] initWithImage: sadface]; 

합니다. -init을 사용하여 뷰를 초기화하는 것은 지정된 초기화 코드 인 -initWithFrame:에서 중요한 코드를 건너 뛸 수 있으므로 뷰를 초기화하는 것은 좋지 않습니다.

자기에게 face1view를 추가 했으므로보기보다 프레임이 아니라 경계를 실제로 사용해야합니다.

face1view.frame = self.view.bounds; 

같은 것은 더 행복한 얼굴입니다. 그런 다음 -touchesMoved:…에서 face2view의 프레임을 self.view 내부로 이동하거나 self.view에 얼굴 외 다른 하위 뷰가없는 경우 self.view의 경계 인을 수정하여 내부의 얼굴을 함께 이동해야합니다. 대신 face2view에서 행복한 얼굴을 세로로 늘리는 것과 같은 이상한 행동을합니다. 당신은 (이미지 뷰 '프레임을 변경하여 얼굴을 교환하기로 선택한 경우

face2view.frame = CGRectOffset(face2view.frame, 0, CGRectGetHeight(self.view.bounds)); 

: 당신은 행복한 얼굴이 self.view의 바닥에서 미끄러하려는 경우, 당신은 처음과 같이 그 프레임 (보이지 초기)를 설정해야합니다 self.view의 바운드를으로 변경하는 것과는 대조적으로, 슬픈 얼굴이 위로 나오고 행복한 얼굴이 위로 들리도록 양쪽 프레임의 프레임 원점을 변경하고 싶을 것입니다. 행복한 얼굴을 원하면 슬픈 하나를 커버 :

face2view.frame = face1view.frame; 
관련 문제