2012-12-04 20 views
9

Tôi bắt đầu nghiên cứu mục tiêu-c bằng cách sử dụng cuốn sách iPhone and iPad apps for Absolute Beginners by Rory Lewis nhưng tôi bị kẹt ở chương thứ 5.CGAffineTransform và chia tỷ lệ thành tâm của hình ảnh

Tôi muốn tạo nút thu nhỏ hình ảnh.
Vấn đề của tôi là sau khi tôi đã viết tất cả mã, hình ảnh co lại thành điểm (0, 0) của UIImageView (phía trên cùng bên trái), trong khi trong video, hình ảnh co lại thành tâm của nó. Tôi đã thực hiện một số nghiên cứu và phát hiện ra rằng CGAffineTransform sử dụng trung tâm của đối tượng để dịch, xoay, v.v.

Vậy tại sao nó không hoạt động trong trường hợp của tôi?

Tôi có phiên bản Xcode mới nhất và chưa thực hiện bất kỳ điều gì lạ. Tôi hy vọng tôi đã rõ ràng. Xin lỗi vì tiếng Anh của tôi.

EDIT Xin lỗi mã, nhưng tôi đã viết câu hỏi từ điện thoại của mình. Dù sao phần buộc tội đi một cái gì đó như thế này

- (IBAction)shrink:(id)sender { 

if(hasShrink == NO){ 
    [shrinkButton setTitle:@"Grow" forState:UIControlStateNormal]; 
} 
else if(hasShrink == YES){ 
    [shrinkButton setTitle:@"Shrink" forState:UIControlStateNormal]; 
} 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:1.0]; 
     myIcon.transform = CGAffineTransformMakeScale(.25, .25); 
     hasShrink = YES; 
     [UIView commitAnimations]; 

}

Tất cả các hình ảnh động được viết một cách chính xác và các ứng dụng làm việc, nó chỉ co lại để phía trên bên trái. Tại sao điểm không được đặt ở trung tâm của UIImageView theo mặc định như nó nên?

EDIT: tôi đã tìm ra nó là một vấn đề gây ra bởi AutoLayout. Khi tàn tật mọi thứ đều suôn sẻ;)

+2

Bạn có thể đăng mã mà bạn đang sử dụng không? –

+0

chỉnh sửa với mã;) – halfblood17

Trả lời

7

Nếu bạn đang chuyển đổi chế độ xem bị cắt xén được bố trí tự động, bạn có thể gặp phải một số tác dụng phụ lạ.See this answer for more details.

Giải pháp mà tôi đã sử dụng là đóng gói chế độ xem mà tôi muốn chuyển đổi bên trong một chế độ xem khác có cùng kích thước. Khung nhìn bên ngoài có các ràng buộc bố cục thích hợp được áp dụng cho nó trong khi khung nhìn bên trong chỉ đơn giản là trung tâm trong vùng chứa của nó. Áp dụng quy tắc chuyển đổi CGAffineTransform cho chế độ xem bên trong giờ đây sẽ xoay vòng chính xác.

+0

Cảm ơn bạn, điều đó đã giúp tôi rất nhiều! – aparesidam

6

Hãy thử một cái gì đó như thế này:

CGAffineTransform t = CGAffineTransformMakeScale(0.5, 0.5); 
CGPoint center = imageView.center; // or any point you want 
[UIView animateWithDuration:0.5 
       animations:^{ 
        imageView.transform = t; 
        imageView.center = center; 
       } 
       completion:^(BOOL finished) { 
        /* do something next */ 
       }]; 

Lần sau hiển thị mã của bạn. Nó sẽ dễ dàng hơn để giúp bạn.

Kiểm tra dự án này: https://github.com/djromero/StackOverflow/archive/Q-13706255.zip

Bạn phải học cách autolayout và autoresize ảnh hưởng đến quan điểm của bạn. Trong dự án trên, cả hai đều bị tắt để cho bạn biết cách hoạt động của dự án.

+0

Tôi đã làm như bạn đã nói nhưng nếu tôi in giá trị của 'myImage.center.x' và' myImage.center.y' nó tiếp tục trỏ đến góc trên bên trái. Tôi đã thử 3 lần để khởi động lại dự án và vẫn có cùng một vấn đề, thậm chí chỉ viết mã cho nút thu nhỏ. '- (IBAction) thu nhỏ: (id) người gửi { nếu (hasMoved == NO && hasShrink == NO) { [UIView beginAnimations: nil context: nil]; [UIView setAnimationDuration: 1.0]; _myIcon.transform = sizeShrink; hasShrink = YES; [UIView commitAnimations]; ' – halfblood17

+0

Nếu bạn đang sử dụng mã đó bạn không làm những gì tôi đã nói. Vui lòng cập nhật câu hỏi với nguồn của bạn, không thêm nhận xét (khó đọc, không đúng địa điểm). – djromero

+0

ok, tôi sẽ sửa lỗi này. Nhưng tôi vẫn cố gắng sử dụng mã của bạn chỉ và không có gì thay đổi .. nó vẫn thay đổi kích thước trong khi di chuyển. – halfblood17

8

Cũ câu hỏi ... nhưng chỉ trong trường hợp người khác đến tìm:

Các CGAffineTransform hành vi (xoay, cân) xung quanh một anchorPoint.

Nếu bạn định cỡ 0, 0 thì điểm neo của bạn được đặt thành 0, 0. Nếu bạn muốn nó có kích thước đến một điểm khác, chẳng hạn như tâm của hình ảnh, bạn cần thay đổi điểm neo.

Các neo là một phần của một lớp

Vì vậy, nếu bạn có một UIImageView gọi imageview, bạn sẽ thực hiện cuộc gọi như thế này để thiết lập các neo đến trung tâm của ImageView:

[imageview.layer setAnchorPoint:CGPointMake(0.5, 0.5)]; 
+3

'anchorPoint' được đo bằng giá trị tương đối và mặc định là' 0,5, 0,5', là trung tâm của chế độ xem. Sử dụng giá trị pixel sẽ không cung cấp cho bạn kết quả mong đợi. – devios1

+0

Cảm ơn ... điểm tốt! – HalR