2

UIView가 있고 그 안에 UIImageView가 있습니다. UIPinchGestureRecognizer를 추가하여 꼬집음 및 확대/축소를 처리하고 UIView가 UIImageView와 함께 커지도록 UIVIew에 추가했습니다.CGAffineTransformScale을 UIView에 적용하면 레이어 테두리가 더 커집니다.

내 UIView에 테두리가 있습니다.

self.layer.borderColor = [UIColor blackColor].CGColor; 
self.layer.borderWidth = 1.0f; 
self.layer.cornerRadius = 8.0f; 

그리고 내가 경계의 동일한 폭을 유지하면서 내 UIView의 더 큰 만드는 방법을 찾을 수 없다 데 문제 : 나는 국경이 방법을 추가했습니다. 테두리를 집거나 확대 할 때 더 두꺼워집니다.

이 내 UIPinchGestureRecognizer 핸들러 :

- (void)scale:(UIPanGestureRecognizer *)sender{ 

    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) { 
     _lastScale = 1.0; 
    } 

    CGFloat scale = 1.0 - (_lastScale - [(UIPinchGestureRecognizer*)sender scale]); 

    CGAffineTransform currentTransform = self.transform; 
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale); 

    _lastScale = [(UIPinchGestureRecognizer*)sender scale]; 

    [self setTransform:newTransform]; 
} 

고마워요!

내가 많이 주위에 인터넷 검색을하고 이걸 발견했습니다 :

self.layer.borderWidth = 2.0f/scaleFactor; 

은 슬프게도 나를 위해 작동하지 않습니다 ... 그것은 의미하지만 작동하지 않습니다한다.

뒷면의 다른보기를 추가하고 앞면보기가 위치에 오프셋을 갖도록하여 뒷면보기가 보이고 테두리처럼 보이도록하는 방법을 읽었습니다. 이미지를 투명하게보아야하므로 옵션이 아닙니다.

아비 아어가 앱에서 수행하는 작업을 다시 만들고 싶습니다. "스티커"를 위아래로 확대 할 수 있으며 테두리는 항상 같은 크기로 유지됩니다.

+0

당신이 당신의'규모의 끝에서'borderWidth'을 재 적용 시도? – ChrisH

+0

borderWidth는 항상 동일합니다.NSLog ("% f", self.layer.borderWith)가 항상 처음 값을 설정했지만 테두리가 커지면 증가하지 않습니다 ... – Andres

+0

의미가 있습니다. 레이어 값은 변경되지 않고 변형을 적용하는 것입니다. 레이어를 확장하는 비율과 동일한 비율로 테두리 크기를 조절할 수 없습니까? – ChrisH

답변

0

CGAffineTransformScale을 설정하는 동안 테두리 너비를 별도로 제어 할 수 없습니다. 위의 뷰 계층 구조에서 다른 뷰의 축척 비율에 따라 SIZE를 변경해야하는 다른 뷰 (예 : borderView)를 위의 뷰 계층 구조에서 사용하는 것이 해결책입니다 (backgroundColor as clearcolor).
border-width를 원하는 테두리 폭을 유지하면서 borderView에 적용하십시오.

행운을 빈다.

0

CGAffineTransform에서보기 프레임으로 전환하십시오. 일정한 경계 폭의 뷰를위한 협

샘플 코드 :

@interface ViewController() 
@property (nonatomic, weak) IBOutlet UIView *testView; 
@end 

@implementation ViewController { 
    CGFloat _lastScale; 
    CGRect _sourceRect; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.testView.backgroundColor = [UIColor yellowColor]; 
    self.testView.layer.borderColor = [UIColor blackColor].CGColor; 
    self.testView.layer.borderWidth = 1.0f; 
    self.testView.layer.cornerRadius = 8.0f; 
    _sourceRect = self.testView.frame; 
    _lastScale = 1.0; 
} 

- (IBAction)scale:(UIPanGestureRecognizer *)sender{ 

    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) { 
     _lastScale = 1.0; 
    } 

    CGFloat scale = 1.0 - (_lastScale - [(UIPinchGestureRecognizer*)sender scale]); 

    CGPoint center = self.testView.center; 
    CGRect newBounds = CGRectMake(0, 0, _sourceRect.size.width * scale, _sourceRect.size.height * scale); 
    self.testView.bounds = newBounds; 
    self.testView.layer.transform = CATransform3DMakeRotation(M_PI * (scale - 1), 0, 0, 1); 
} 

@end 

UPD : 내가 인클로저 앱 체크인 : 프레임에 의해 스케일을 CGAffineTransform으로 회전한다. 작동 시키려면 추가 논리를 구현해야 할 수도 있습니다.

UPD : 사용 범위와는 변환이 경계의 변경하여 뷰의 크기를 확장 설정하지 않고 회전

+0

이 작동하지만, 회전하고 크기를 조정하면 비율이 손실됩니다. 감사! – Andres

+0

RotatingView-> ScalableView와 같은 뷰 계층 구조를 만듭니다. 뷰를 회전해도 서브 뷰의 비율에 영향을주지 않습니다 – LorikMalorik

+0

예, 그렇다면 내 회전 뷰의 프레임 (테두리가있는 위치)이 커지지 않습니다 ... – Andres

0

재생합니다. 이 솔루션은 나를 위해 작동합니다.

당신은 당신이 확장 할 뷰 클래스에 샘플 코드를하는 방법을 추가 할 수 있습니다 :`방법 :

- (void)scale:(CGFloat)scale { 
    self.bounds = CGRectMake(0, 0, CGRectGetWidth(self.bounds) * scale, CGRectGetHeight(self.bounds) * scale); 
}