2009-06-27 50 views
11

Tôi có một số UIScrollView có số UIImageView. Tôi muốn hiển thị các ghim trên số imageView này. Khi tôi thêm ghim dưới dạng bản xem phụ của ImageView, mọi thứ đều tuyệt vời ngoại trừ khi bạn phóng to quy mô biến đổi cũng xảy ra trên các ghim. Tôi không muốn hành vi này và muốn các chân của tôi vẫn giữ nguyên.UIScrollView Xem hình ảnh có ghim ở trên cùng

Vì vậy, tôi chọn thêm Ghim vào chế độ xem khác nằm ở trên cùng của ImageView và cũng là chế độ xem phụ của UIScrollView. Ý tưởng ở đây nếu bạn sẽ tưởng tượng là có một lớp mà di chuyển trên bản đồ và sẽ không quy mô chưa hiển thị ghim trên nơi tôi vẽ chúng.

Ghim khi được thêm vào chế độ xem lớp không làm giảm cân nếu thang đo ImageView. Tuy nhiên, vấn đề sau đó trở thành vị trí của các chân không khớp với nguồn gốc ban đầu x/y vì ImageView đã có quy mô biến đổi.

Về cơ bản đây là bản đồ tùy chỉnh của một địa điểm có Ghim. Tôi đang cố gắng để các Ghim nổi lên và không phóng to và thu nhỏ trên ImageView của mình nhưng vẫn nhớ nơi tôi đặt chúng khi quá trình thu phóng diễn ra.

Một số mã:

scrollView = [[UIScrollView alloc] initWithFrame:viewRect]; 

scrollView.delegate = self; 
scrollView.pagingEnabled = NO; 
scrollView.scrollsToTop = NO; 
[scrollView setBackgroundColor:[UIColor clearColor]]; 
scrollView.clipsToBounds = YES; // default is NO, we want to restrict drawing within our scrollview 
scrollView.bounces = YES; 
scrollView.autoresizingMask = UIViewAutoresizingFlexibleHeight; 
scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; 

imageViewMap = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]]; 

imageViewMap.userInteractionEnabled = YES; 

viewRect = CGRectMake(0,0,imageViewMap.image.size.width,imageViewMap.image.size.height); 

//viewRect = CGRectMake(0,0,2976,3928); 

[scrollView addSubview:imageViewMap]; 

[scrollView setContentSize:CGSizeMake(viewRect.size.width, viewRect.size.height)]; 

iconsView = [[UIView alloc] initWithFrame:imageViewMap.frame]; 

[scrollView addSubview:iconsView]; 

Mã để thêm Pin sau trên một số sự kiện.

[iconsView addSubview:pinIcon]; 

Tôi bị kẹt khi cố gắng tìm ra cách để ghim các ghim trên bản đồ mà không di chuyển khi quy mô diễn ra.

Trả lời

9

Tôi thích ý tưởng của bạn về việc giữ tất cả các ghim trong chế độ xem dành riêng cho ghim (iconsView), nhưng tôi quyết định chỉ thêm chúng dưới dạng bản xem phụ của những gì bạn gọi là imageViewMap.

Nhập tệp QuartzCore.framework vào dự án của bạn.

Gọi bộ điều khiển chế độ xem của bạn MyViewController.

#import <QuartzCore/QuartzCore.h> 
@interface MyViewController : UIViewController <UIScrollViewDelegate> 
@property (retain) UIScrollView *scrollView; 
@property (retain) UIImageView *imageView; 

// và vân vân

@implementation MyViewController 

@synthesize scrollView; 
@synthesize imageView; 

tôi sẽ giả sử bạn có một cái nhìn chân hoặc một bộ điều khiển xem gọi DropPinViewController. Nếu bạn chỉ sử dụng một hình ảnh, nó có thể là một UIImageView, nhưng chân của tôi có nhãn, vì vậy tôi đã sử dụng một xib. Các pin nên trỏ đến trung tâm dưới cùng của xib bởi vì chúng ta sẽ đặt một điểm neo ở đó.

Trong chế độ xem của bạnDidLoad của MyViewController, hãy thêm chế độ xem ghim của bạn dưới dạng bản xem phụ của imageView. Thêm imageView làm subview vào scrollView. Đặt kích thước nội dung của scrollView.

scrollView.delegate = self; 

Sử dụng các phương pháp đại biểu:

- (void)scrollViewDidZoom:(UIScrollView *)aScrollView 
{ 
    for (UIView *dropPinView in imageView.subviews) {  
    CGRect oldFrame = dropPinView.frame; 
    // 0.5 means the anchor is centered on the x axis. 1 means the anchor is at the bottom of the view. If you comment out this line, the pin's center will stay where it is regardless of how much you zoom. I have it so that the bottom of the pin stays fixed. This should help user RomeoF. 
    [dropPinView.layer setAnchorPoint:CGPointMake(0.5, 1)]; 
    dropPinView.frame = oldFrame; 
    // When you zoom in on scrollView, it gets a larger zoom scale value. 
    // You transform the pin by scaling it by the inverse of this value. 
    dropPinView.transform = CGAffineTransformMakeScale(1.0/scrollView.zoomScale, 1.0/scrollView.zoomScale); 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return imageView; 
} 
+0

Điều này thật tuyệt vời Tôi bị bệnh. Tôi có nhiều phương pháp phức tạp khác làm điều này ... Rất đơn giản. Tôi chuyển sang điều này và nó hoạt động tuyệt vời. – malaki1974

+0

Mẹo hay. Bạn có thể làm một điều tương tự bằng cách có các chân trên quan điểm riêng của họ và mở rộng quy mô của họ thay thế. Tự hỏi liệu điều đó có thể diễn đạt nhiều hay ít. –

3

Vì vậy, một điều tôi đã triển khai chưa giải quyết được vấn đề của mình nhưng tôi nghĩ rằng đó là con đường bên phải là từ bài viết này.

Anchor a UIView

Tôi có phân cấp chế độ xem như sau.

UIScrollView 
- UIImageView (map image) 
- IconsView (layer image to hold icons) 

Bước tiếp theo tôi cần phải giải quyết là để giữ chân tôi thêm vào IconsView neo ở cùng một chỗ khi UIImageView đã được thu nhỏ trong và ngoài.

Tôi đã có một vòng lặp đi qua tất cả các chân của tôi là Subviews của IconsView và cập nhật Origin X và Y. Đây là phương thức scrollViewDidScroll của đại biểu.

Vấn đề là kỹ thuật này có hiệu suất khủng khiếp trên thiết bị khi có rất nhiều ghim trên bản đồ có quá nhiều xử lý cần phải xảy ra.

0

Một vài đề xuất:

1) Bạn sẽ thấy trong ứng dụng Google Maps giới hạn số chân mà cố gắng hiển thị theo mặc định. Nó sẽ chỉ hiển thị kết quả gần nhất với điểm trung tâm ngay cả khi có nhiều kết quả phù hợp hơn.

2) Bạn có thể giấu nhanh các chân trong bất kỳ thao tác cuộn hoặc chụm nào để giao diện vẫn đáp ứng và vẽ lại chúng ngay khi chế độ xem hình ảnh ngừng di chuyển.

3) Nếu bạn phải hiển thị số lượng lớn ghim và tạo hiệu ứng cho chúng, bạn cũng có thể xem xét sử dụng CABasicAnimations để tạo hiệu ứng ghim và phông nền cùng lúc, chuyển đổi vị trí chân bằng cách sử dụng cùng một phép tính biến đổi phông nền tỉ lệ. Điều này có thể làm mịn màn hình bằng cách truyền hình ảnh động mượt mà hơn và chạy chúng ở mức khá thấp, nhưng giới thiệu những thách thức và hạn chế khác.

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/Animation_Types_Timing/Articles/PropertyAnimations.html#//apple_ref/doc/uid/TP40006672-SW1

Barney

0

Tôi có cùng một vấn đề và tôi tìm thấy những ý tưởng của tay chỉnh vị trí của pin không phải là rất khá. Sau đó, tôi thay vì vẽ chân của tôi vào xem trở lại trong chức năng đại biểu viewForZoomingInScrollView: và cập nhật kích thước subview (đánh dấu) sau khi phóng to đã hoàn thành.

Tuy nhiên, điều này khiến tôi thấy rằng điều này có thể xảy ra trong Ứng dụng Google Maps, nhưng tôi không thể tạo lại nó.

Một điều nữa: Bất cứ ai có thể giải thích cho tôi về triển lãm hành vi khi tôi thêm các bản xem trước vào UIScrollView không phải là 'viewForZoomingInScrollView' ..? Ví dụ:

UIImageView* marker = [[UIImageView alloc] initWithImage: myMarkerImage]; 
[marker setCenter: CGPointMake(250,150)]; 
[myScrollView addSubview: marker]; 

Điều này có vẻ phù hợp với chế độ xem ban đầu và khi xoay. Khi phóng to, những bản xem trước đó không được thay đổi kích thước, mà thực ra là những gì chúng tôi đang nhắm tới, nhưng vấn đề là nguồn gốc khung hình UIView được di chuyển qua chế độ xem cuộn theo một cách khá lạ. Có vẻ như nếu một người phóng to, marker.frame.size.origin luôn di chuyển về phía góc trên bên trái (superview's (0,0)), tạo ấn tượng rằng chúng tôi đang thực sự thu nhỏ. Điều này cũng kỳ lạ, bởi vì "trung tâm thu phóng" phải luôn ở giữa màn hình, phải không? Vâng, tôi không nhận được nó ngay bây giờ.

vết sưng. ;)

0

Nhờ David Braun. Mã của bạn hoạt động ngoại trừ một dòng mà tôi đã nhận xét.Dự án của tôi liên quan đến việc có UIScrollView, sau đó là UIImageView trên đầu hiển thị bản đồ, sau đó, ghim (nút) vị trí mã sau khi cảm nhận cử chỉ nhấn đúp. Mã của bạn đã giúp tôi giải thích quy mô thu phóng. Hạn chế mặc dù là khi tôi pinch để phóng to, mỗi pin không "dính" vào phần cụ thể của bản vẽ, nơi tôi tăng gấp đôi khai thác. Tôi tình cờ tìm ra giải pháp khi tôi nhận xét ra dòng này:

//[dropPinView.layer setAnchorPoint: CGPointMake (0.5, 1)];

Tôi không hiểu đầy đủ nhưng mã của tôi hiện hoạt động! Tôi hy vọng những người khác sẽ được hưởng lợi từ kinh nghiệm của tôi. Cảm ơn David!

Các vấn đề liên quan