2016-01-17 8 views
10

Mój problem jest dość prosta naprawdę ...iOS Swift: Jak nałożyć dwa obrazy, które przybliżyć w tym samym czasie bez utraty współrzędne nakładanie obrazu

Wyobraźmy sobie obraz tła, który reprezentuje ulice i budynki wokół domu, zauważ, że jest to obraz zbudowany na podstawie celu. Ten obraz (widok) jest zoomowalny i do tej pory taki dobry. Podobne do mapy, ale z obrazem.

Teraz obraz, który na szczycie ulic narysowanych na obrazie są znaczniki reprezentujące samochody. Będą one poruszać się w czasie i dlatego będą się dynamicznie poruszać. Z powodzeniem umieściłem samochody we właściwym miejscu na obrazie, ale kiedy powiększam/pomniejszam, samochody ruszają się z miejsca. Pamiętaj, że nie chcę, aby samochody się zmieniały, zawsze pozostaną takie same.

Zasadniczo bardzo podobny do znacznika mapy na górze mapy google, ale zamiast mapy mam obraz tła, a zamiast znaczników mam inne obrazy (samochody).

Teraz do realizacji ... Mam prosty ScrollableView, który zawiera widok obrazu. Próbuję nakładać inne obrazy, które chcę zachować, ale nie powiększać ani pomniejszać (a przynajmniej nie tak bardzo jak obraz główny). Powiedziałbym, że jest podobny do mapy, na której znajdują się szpilki lokalizacyjne, ale to tylko obrazy. Robię to w Swift i najnowsza wersja systemu iOS (9x)

import UIKit 

class ViewController: UIViewController, UIScrollViewDelegate 
{ 
    @IBOutlet weak var scrollView: UIScrollView! 
    @IBOutlet weak var imageView: UIImageView! 
    @IBOutlet weak var pin1View: UIImageView! 
    @IBOutlet weak var pin2View: UIImageView! 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     self.scrollView.minimumZoomScale = 1.0; 
     self.scrollView.maximumZoomScale = 10.0; 



    } 

    override func didReceiveMemoryWarning() 
    { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? 
    { 
     let pin1_X = self.pin1View.frame.origin.x 
     let pin2_Y = self.pin2View.frame.origin.y 
     //I guess I need to do something here but not sure 
     return self.imageView 
    } 
} 

Wszelkie wskazówki mile widziane. Przeszukałem go, ale nie mogłem znaleźć przykładów i wciąż się uczyć widoków i szybkich, a także ogólnych urządzeń mobilnych. Dzięki za pomoc.

Odpowiedz

3

Masz odpowiednio zmienić środek sworznia. Użyj tego zaktualizowanego kodu:

class ViewController: UIViewController, UIScrollViewDelegate 
{ 
    @IBOutlet weak var scrollView: UIScrollView! 
    @IBOutlet weak var imageView: UIImageView! 
    @IBOutlet weak var pin1View: UIImageView! 
    @IBOutlet weak var pin2View: UIImageView! 
    var pin1ViewCenter : CGPoint = CGPointZero 
    var pin2ViewCenter : CGPoint = CGPointZero 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     self.scrollView.scrollEnabled = true 
     self.scrollView.minimumZoomScale = 1.0 
     self.scrollView.maximumZoomScale = 10.0 

     pin1ViewCenter = pin1View.center 
     pin2ViewCenter = pin2View.center 

     self.scrollView.contentSize = self.imageView.frame.size 
    } 


    override func didReceiveMemoryWarning() 
    { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

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

    func scrollViewDidZoom(scrollView: UIScrollView) { 

     let scaleAffineTransform = CGAffineTransformScale(CGAffineTransformIdentity, scrollView.zoomScale, scrollView.zoomScale) 
     var translatedPoint = CGPointApplyAffineTransform(pin1ViewCenter, scaleAffineTransform) 
     pin1View.transform = CGAffineTransformTranslate(CGAffineTransformIdentity, translatedPoint.x - pin1ViewCenter.x , translatedPoint.y - pin1ViewCenter.y) 
     translatedPoint = CGPointApplyAffineTransform(pin2ViewCenter, scaleAffineTransform) 
     pin2View.transform = CGAffineTransformTranslate(CGAffineTransformIdentity, translatedPoint.x - pin2ViewCenter.x, translatedPoint.y - pin2ViewCenter.y) 
    } 

    func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) { 
     let scaleAffineTransform = CGAffineTransformScale(CGAffineTransformIdentity, scale, scale) 
     scrollView.contentSize = CGSizeApplyAffineTransform(self.imageView.bounds.size, scaleAffineTransform) 
    } 

} 
+0

Dzięki! Ale mając niewielki problem z błędem krytycznym: nieoczekiwanie znaleziono zero podczas rozpakowywania wartości opcjonalnej w tym wierszu: pin1ViewCenter = pin1View.center żadnych pomysłów? – user2091936

+1

Upewnij się, że pin1View jest prawidłowo podłączony do storyboardu, dzieje się, gdy jest zerowy. –

Powiązane problemy