Frage

Ich habe eine UIScrollView, die eine UIImageView hat. Ich möchte Pins auf diesem imageView zeigen. Als ich Stifte als Subviews der ImageView hinzufügen, ist alles toll, bis auf, wenn Sie die Waage geschieht auch auf die Stifte verwandeln zoomen. Ich glaube nicht, dieses Verhalten wollen und meine Stifte gleich bleiben.

So wähle ich die Pins zu einer anderen Ansicht hinzuzufügen, die auf der Oberseite des Image sitzt und ist auch ein Subview des UIScrollView. Die Idee hier, wenn Sie sich vorstellen wird, ist eine Schicht zu haben, die die Karte schwebt über und werden nicht noch zeigen maßstabsStifte über, wo ich sie zeichnen.

Der Stift, wenn zu der Schicht hinzugefügt Ansicht cale nicht, ob die ImageView Waage. Jedoch wird das Problem dann die Position der Stifte nicht die ursprüngliche Herkunft x / y überein als die ImageView eine Skala hatte zu verwandeln.

Im Grunde ist dies eine benutzerdefinierte Karte eines Ortes mit Pins. Ich versuche, die Pins zu haben, schweben und nicht hinein- und herauszoomen über mein Image noch erinnern, wo ich sie gestellt, wenn der Zoom passiert.

Einige Code:

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];

PIN-Code hinzuzufügen, später ein Ereignis.

[iconsView addSubview:pinIcon];

Ich bin bei dem Versuch, tp herauszufinden stecken, wie man meine Pins auf der Karte zu schweben zu bekommen ohne sich zu bewegen, wenn die Waage passiert.

War es hilfreich?

Lösung

Ich mag deine Idee, alle Stifte halten in Hinblick auf die Stifte (iconsView) gewidmet, aber ich beschlossen, nur sie als Subviews von hinzufügen, was Sie genannt imageViewMap.

Importieren Sie die QuartzCore.framework Datei zu Ihrem Projekt.

Rufen Sie Ihren View-Controller MyViewController.

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

// und so weiter

@implementation MyViewController

@synthesize scrollView;
@synthesize imageView;

Ich nehme an, dass man eine Stecknadel Ansicht oder einen View-Controller namens DropPinViewController. Wenn Sie nur ein Bild verwendet wird, kann es sich um eine UIImageView, aber meine Stifte haben Etiketten, so habe ich eine xib. Der Stift an der unteren Mitte des xib zeigen sollte, weil wir gehen dort einen Ankerpunkt setzen.

In Ihrem viewDidLoad Ihrer MyViewController, Ihre PIN-Ansichten als Subviews von Imageview hinzuzufügen. Fügen Sie den Imageview als Subview der Scrollview. Stellen Sie die Inhaltsgröße von Scroll.

scrollView.delegate = self;

diese Delegatmethoden Verwendung:

- (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;
}

Andere Tipps

So eine Sache, die ich umgesetzt haben, was mein Problem nicht gelöst hat, aber ich denke, es ist unten der richtige Weg aus diesem Artikel ist.

Anchor ein UIView

Ich habe meine Ansicht Hierarchie wie folgt.

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

Der nächste Schritt muß ich lösen, ist meine Stifte zu halten hinzugefügt an der gleichen Stelle verankert IconsView wenn der UIImageView vergrößert und verkleinert wird.

hatte ich eine for-Schleife, die durch alle meine Stifte gingen die Subviews von IconsView sind und aktualisiert ihre Herkunft X und Y. Dies wurde in der UIScrollView Methode des scrollViewDidScroll Delegierten.

Das Problem war, diese Technik schreckliche Leistung auf dem Gerät hat, wie wenn es eine Menge von Pins auf der Karte gibt es zu viel Verarbeitung ist, was passieren muss.

Ein paar Empfehlungen:

1) Sie werden in der Google Maps-Anwendung feststellen, dass es die Anzahl der Pins begrenzt, die es standardmäßig angezeigt werden versucht. Es wird nur die Ergebnisse angezeigt werden am nächsten der der Mittelpunkt, auch wenn es mehr mögliche Treffer.

2) Sie könnten kurz die Stifte während einer Scroll- oder Pinch Aktion verstecken, so dass die Schnittstelle ansprechbar bleibt und neu zu zeichnen sie den Moment der Bildansicht nicht mehr bewegt.

3) Wenn Sie müssen eine große Anzahl von Pins angezeigt werden und animieren sie, auch in mit CABasicAnimations aussehen könnten die Stifte und die Kulisse zugleich, die Umwandlung der Stifte Position unter Verwendung der gleichen Mathematik zu animieren, dass die Kulissen verwandelt skalieren . Dies könnte die Anzeige glättet von Animationen glatten und laufen sie auf einem relativ niedrigen Niveau verbreitet, sondern stellt andere Herausforderungen und Einschränkungen.

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

Barney

Ich habe das gleiche Problem, und ich finde die Idee von Hand des Stifts Standort nicht sehr schön zu korrigieren. Dann habe ich eher meine Stifte auf die in der Delegatfunktion viewForZoomingInScrollView: zurück Ansicht ziehen und die Subview (Marker) Größe aktualisieren, nachdem Zoomen beendet hat.

Es ist jedoch nörgelt mir, dass dies in der Google Maps App möglich ist, aber ich kann es nicht neu.

Eine weitere Sache: Kann mir jemand das Verhalten exhibitet erklären, wenn ich Subviews die UIScrollView, die nicht die ‚viewForZoomingInScrollView‘ hinzuzufügen ..? Zum Beispiel:

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

Dies scheint für den ersten Blick gut zu funktionieren und beim Schwenken. Beim Zoomen werden diese Subviews nicht geändert, was eigentlich ist, was wir wollen, aber das Problem ist, dass die UIView Rahmen Herkunft über die Scroll-Ansicht in einige ziemlich seltsamen Art und Weise bewegt wird. Es scheint, dass, wenn man zoomt, die marker.frame.size.origin immer in Richtung der oberen linken Ecke bewegt (Superview ist (0,0)), den Eindruck zu erwecken, dass wir tatsächlich Auszoomen werden. Dies ist auch seltsam, weil das „Zoom-Zentrum“ immer in der Mitte des Bildschirms sein sollte, nicht wahr? Nun, ich verstehe es nicht für jetzt.

stoßen. ;)

Dank David Braun. Ihr Code funktioniert, außer für eine Zeile, die ich kommentieren Sie musste. Mein Projekt beteiligt mit einem UIScrollView, dann ein UIImageView auf die eine Karte zeigt, dann schließlich Stifte (Tasten), dass die Codepositionen nach einem Doppeltippgeste Abtasten. Ihr Code hat mir geholfen, machen den Zoomfaktor. Die Einschränkung war aber, dass, wenn ich es zu vergrößern kneifen, wird jeder Stift nicht „kleben“ auf den spezifischen Teil der Zeichnung, wo ich angezapft verdoppeln. Ich stolperte auf der Lösung, wenn ich aus dieser Zeile kommentiert:

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

Ich habe nicht das Verständnis, aber mein Code funktioniert jetzt! Ich hoffe, dass andere aus meiner Erfahrung profitieren. Dank David!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top