2015-12-07 44 views
1

我使用PaintCode繪製了一個圖像。該圖像有一個Scale變量。在標記爲「// A」的行上,我編輯了通常的PaintCode生成的代碼,以便我可以傳遞一個縮放比例,並以正確的高度和寬度創建圖像。當我縮放時,我想以正確的縮放級別從PaintCode向圖像視圖提供新圖像

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 
} 

現在我有一個UIImageView裏面的UIScrollView。而且我的scrollview約束在ViewController視圖的內部,並且使用自動佈局約束將imageview約束到scrollview的內部。

我已經看過「viewForZooming」和「scrollViewDidZoom」,但那些只在圖像視圖上使用CGAffineTransformScale。我已經嘗試在「scrollviewDidZoom」中設置正確的圖像,並嘗試使用我自己的捏手勢識別器,但我的數學必須是錯誤的,但我不知道在哪裏。

每次我縮放時,我都想以正確的縮放級別從PaintCode提供一幅新圖像。

此外,我想讓圖像「保持原樣」,正如人們在縮放Google地圖或Apple地圖時所期望的那樣。現在我試圖將scrollView的contentOffset乘以contentSize,scrollView的框架和當前比例的倍數,並且圖像在縮放時會跳躍很多。

我做了大量的研究和修補,並沒有能夠弄清楚這一點。所以我終於在這裏問。請幫忙!感謝您的時間。

回答

0

我能弄明白!

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 
} 

需要保存在一個臨時變量contentOffset上滾動視圖設置zoomScale

編輯:當然contentSizeForScale返回的圖像將是在給定規模的什麼CGSize!