2015-12-07 1 views
1

J'ai une image dessinée en utilisant PaintCode. Et cette image a une variable Scale. sur la ligne marquée "// A", j'ai édité le code généré par PaintCode habituel afin que je puisse passer une échelle et que l'image soit créée à la bonne hauteur et largeur.Lorsque je zoome, je souhaite fournir une nouvelle image à la vue de PaintCode au niveau de zoom correct

public class func imageOfMap(scale scale: CGFloat = 1) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(
     CGSizeMake(scale*1660, scale*1832), // A 
     false, 0) 
    MapStyleKit.drawMap(scale: scale) 

    let imageOfMap = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return imageOfMap 
} 

Maintenant, j'ai un UIImageView à l'intérieur d'un UIScrollView. Et j'ai le scrollview contraint à l'intérieur de la vue de mon ViewController, et l'imageview contraint à l'intérieur de la scrollview, en utilisant des contraintes de mise en page automatique.

J'ai regardé "viewForZooming" et "scrollViewDidZoom", mais ceux-ci n'utilisent qu'une CGAffineTransformScale sur la vue de l'image. J'ai essayé de définir l'image correcte dans "scrollviewDidZoom" et j'ai essayé d'utiliser mes propres reconnaisseurs de gestes de pincement, mais mes maths doivent se tromper sur certains endroits mais je ne sais pas où.

Chaque fois que j'effectue un zoom, je souhaite fournir une nouvelle image à partir de PaintCode au bon niveau de zoom. En outre, je souhaite que l'image reste «en place» comme on s'y attendrait lorsque l'on pince pour zoomer sur Google Maps ou Apple Maps. En ce moment j'essaye de multiplier le contentOffset du scrollView par un facteur du contentSize, du cadre de scrollView et de l'échelle courante, et l'image saute autour beaucoup en zoomant.

J'ai fait beaucoup de recherches et de bricolages et je n'ai pas été capable de comprendre cela. Donc, je demande enfin ici. S'il vous plaît aider! Merci pour votre temps.

Répondre

0

J'ai été capable de le comprendre!

func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) { 
    let newScale: CGFloat 
    if scale <= scrollView.minimumZoomScale { 
     newScale = scrollView.minimumZoomScale 
    } else if scale >= scrollView.maximumZoomScale { 
     newScale = scrollView.maximumZoomScale 
    } else { 
     newScale = scale 
    } 

    let offset = scrollView.contentOffset 
    scrollView.zoomScale = 1.0 
    imageView.image = MapStyleKit.imageOfMap(scale: newScale) 
    scrollView.contentSize = contentSizeForScale(newScale) 
    imageView.frame = CGRect(origin: CGPointZero, size: contentSizeForScale(newScale)) 


    scrollView.contentOffset = offset 
} 

func scrollViewWillBeginZooming(scrollView: UIScrollView, withView view: UIView?) { 
    let offset = scrollView.contentOffset 
    scrollView.zoomScale = imageView.scale 
    imageView.image = MapStyleKit.imageOfMap(scale: 1.0) 
    scrollView.contentSize = contentSizeForScale(1.0) 
    imageView.frame = CGRect(origin: CGPointZero, size: contentSizeForScale(1.0)) 
    scrollView.contentOffset = CGPoint(x: imageView.scale*offset.x, y: imageView.scale*offset.y) 
} 

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { 
    return imageView 
} 

Nécessité d'enregistrer le contentOffset dans une variable temporaire avant de zoomScale sur le scrollview

Edit: Et bien sûr contentSizeForScale retourne un CGSize de ce que l'image sera à une échelle donnée!