UIView의 외형을 변경시기지 위해 두가지 방법이 있다

UIView 내에 transform 값을 변경시키는 것과 UIView.layer 의 transform을 변경시키는 방법이다.

간단하게 사용하기 위해서는 UIView 의 transform을 사용하면 된다.

사용방법 (self = UIView 의 인스턴스)

1. self.transform = CGAffineTransformMakeScale(scale, scale);

2. self.transform = CGAffineTransformScale(self.transform, deltaScale, deltaScale);

위 1번 함수인 CGAffineTransformMakeScale을 통해서 view의 비율을 입력되는 Scale값으로 변경할 수 있다.(절대 크기) 하지만 Make가 들어간 함수는 기존의 설정값을 무시하고 새로운 값으로 덮어버린다.

기존 외형에 추가로 변경을 하기 위해서는 2번 함수를 사용해야 하는데 2번 함수는 현재 transform의 상태와 Scale값을 입력하지만 여기서 중요한 점은 scale값은 기존 값에 대한 변위 값이다.(기존 값에 대한 상대적인 크기)

하지만 UIView 내에 있는 transform을 사용하게 될 경우 한가지 불편한 점은 현재 뷰 상태의 scale값을 알기 힘들다는 점이다. 이 부분은 1번 함수를 사용할때 처럼 절대값을 입력할때는 문제가 안되는데 2번같은 경우에는 문제가 생기게 된다. 이전의 scale값을 알기 힘들기 때문에 상대적인 값을 알기가 힘들다.

이런 문제를 해결하기 위해서는 UIView내 layer의 transform을 사용하면된다.

이 layer의 transform을 사용할 경우 사용방법은 위 함수 사용과 유사하다.

3. self.layer.transform = CATransform3DMakeScale(scale, scale, 1);

4. self.layer.transform = CATransform3DScale(self.layer.transform, deltaScale, deltaScale, 1);

한가지 차이점은 뒤에 z 값을 추가로 입력하게 되는데 함수명에서도 볼수 있듯이 3d 변형이 가능하기 때문에 z축으로 변경하기 위한 값이다. 만약 여기에 0을 입력해도 보이는 결과는 차이는 없이지만 다시 scale값을 얻을때 올바르지 않은 값을 반환한다.

앞에서 지적했단 단점인 현재 scale값을 알기 위해서는 아래의 방법을 사용하면된다.

CGFloat scale = [[self.layer valueForKeyPath:@"transform.scale.x"] floatValue];

즉 valueForKeyPath를 통해 현재 뷰의 scale값을 얻을 수 있게된다. 이렇게 얻어진 값을 바탕으로 scale값의 상대값을 구할 때 편하게 사용할수 있다.

여기서 한가지 재미있는 점은 위 처럼 valeForKeyPath를 통해 값을 얻어올수 있듯이 반대로 값을 지정하는 것도 가능하다.

[self.layer setValue:[NSNumber numberWithFloat:scale] forKeyPath:@"transform.scale.x"]

이렇게 지정하면 3번째 명령 처럼 진행되게 된다. 하지만 이런 방법을 사용할 경우 일부 기능에서 제대로 작동이 안되게 되는 경우가 있다.(예 View 상태를 image로 캡쳐할 때등)

특별한 경우가 아니면 3번의 방법을 사용하는게 올바른 것 같다.

마지막으로 위 예들은 모두 scale값만 표현을했는데 회전을 시킬수 있는 rotation 함수 역시 존재한다. 위 scale과 rotation을 적절히 조합하면 뷰를 자신이 생각하는 모양으로 변경 및 애니메이션 효과를 줄수 있을 것이다.

 

+ Recent posts