2010-10-15 28 views
12

Tôi có một UIView mà tôi đã thiết lập để phản ứng với cử chỉ chụm và thay đổi kích thước của nó, ngoại trừ khi bạn phóng to và sau đó thử và véo lại, nó nhảy về kích thước ban đầu (mà chỉ xảy ra là 100x200). Đây là mã:CGAffineTransformMakeScale Làm cho UIView Chuyển sang Kích thước Ban đầu trước khi chia tỷ lệ

@implementation ChartAxisView 


- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     // do gesture recognizers 
     UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(onPinch:)]; 
     [self addGestureRecognizer:pinch]; 
     [pinch release]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGColorRef redColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0].CGColor; 

    CGContextSetFillColorWithColor(context, redColor); 
    CGContextFillRect(context, self.bounds); 
} 

- (void)onPinch: (UIPinchGestureRecognizer*) gesture { 
    self.transform = CGAffineTransformMakeScale(gesture.scale, gesture.scale); 
} 

- (void)dealloc { 
    [super dealloc]; 
} 


@end 

Bạn nghĩ gì?

Trả lời

26

Vì vậy, có hai loại Scale (hoặc, biến đổi nói chung) chức năng: CGAffineTransformMakeScaleCGAffineTransformScale

Người đầu tiên, CGAffineTransformMakeScale mà bạn đang sử dụng, luôn luôn biến đổi liên quan đến kích thước ban đầu của hình ảnh với. Và đó là lý do tại sao bạn nhìn thấy bước nhảy đến kích thước ban đầu của nó trước khi việc mở rộng diễn ra.

Cái thứ hai, CGAffineTransformScale, biến đổi từ vị trí hiện tại của hình ảnh. Đây là những gì bạn cần. Đối với điều này, nó đòi hỏi một 'biến đổi' bổ sung arg. Các 'biến đổi' arg trong trường hợp của bạn đại diện cho hình ảnh mở rộng.

Đọc this bài đăng blog rất thông tin về các phép biến đổi.

+0

Ngoài ra, autoresizing sẽ gây trở ngại đối với can thiệp vào vị trí, ngay cả khi 'CAAffineTransformScale' được sử dụng. –

2
- (void)onPinch: (UIPinchGestureRecognizer*) gesture { 

    if ([gesture state] == UIGestureRecognizerStateBegan) 
    { 
    curTransform = self.transform; 
    } 

    self.transform = CGAffineTransformScale(curTransform,gesture.scale, gesture.scale); 
} 
  • sử dụng CGAffineTransformScale thay vì CGAffineTransformMakeScale
  • bạn sẽ cần một thành viên -> CGAffineTransform curTransform;

;)

2

bạn có thể thiết lập chuyển đổi với đoạn mã sau:

ivClone setTransform:CGAffineTransformMakeScale(scale, scale)]; 

và bạn có thể nhận được hiện chuyển đổi với coee sau:

newV.transform.a //x scale 
newV.transform.d // y scale 
Các vấn đề liên quan