2016-10-11 6 views
2

У меня есть два образа, один с изображением, другой с изображением, определенным с помощью методов CGContext, с одинаковым размером изображения и размером изображения, друг над другом. В раскадровке я могу установить оба изображения на «Aspect Fit», чтобы пользователи на разных устройствах все еще могли видеть изображение. Однако, когда я собираюсь что-то нарисовать на наложенном втором изображении, он не масштабирует его соответственно (или относительно первого изображения, хотя они имеют одинаковый размер). Как мне сделать второе изображение в наложенном изображении в том же масштабе, что и изображение ниже?Swift CGContext Aspect Fit

Пример кода:

import CoreGraphics 
import UIKit 

class Map: UIViewController, UIScrollViewDelegate { 
    @IBOutlet weak var scrollView: UIScrollView! 
    @IBOutlet weak var imageView: UIImageView! 
    @IBOutlet weak var drawnImageView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.scrollView.minimumZoomScale = 1.0 
     self.scrollView.maximumZoomScale = 6.0 

     let data = grabData() 
     print(data!) 

     var img = UIImage(named: "floor1") 
     print(img!.size) 
     imageView.image = img 

     img = draw(imageView.bounds.size, data: data!) 
     print(img!.size) 
     drawnImageView.image = img 
     for c in drawnImageView.constraints { 
      if c.identifier == "constraintImageHeight" { 
       c.constant = img!.size.height * drawnImageView.bounds.width/img!.size.width; 
       break; 
      } 
     } 
    } 
} 

func draw(img: UIImage) -> UIImage { 
    UIGraphicsBeginImageContext(img.size) 
    let context = UIGraphicsGetCurrentContext() 

    // Drawing 
    let color = UIColor(red: 0.67, green: 0.4, blue: 0.56, alpha: 1) 
    CGContextSetStrokeColorWithColor(context, color.CGColor) 
    CGContextSetLineWidth(context, 2.0) 

    var y = 0 
    for _ in 0..<100 { 
     let b = CGRect(origin: CGPoint(x: 0, y: y), size: CGSize(width: 1200, height: 1)) 
     CGContextStrokeRect(context, b) 
     y += 30 
    } 

    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return newImage 
} 

Update 1:
(заменить после '// Рисование') При загрузке с iPhone 5 тренажере, он не появляется в том же месте отношение к фотографии, как в симуляторе iPhone 6.

func draw(size: CGSize, data: [TotalLine]) -> UIImage { 
    UIGraphicsBeginImageContext(size) 
    let context = UIGraphicsGetCurrentContext() 
    let screen: CGRect = UIScreen.mainScreen().bounds 
    let x = screen.size.width, y = screen.size.height 

    // Drawing 
    //let color = UIColor(red: 0.67, green: 0.4, blue: 0.56, alpha: 1) 
    let color = UIColor.redColor() 
    CGContextSetStrokeColorWithColor(context, color.CGColor) 
    CGContextSetLineWidth(context, 2.0) 

    let line = CGRect(origin: CGPoint(x: (x/16), y: (y*0.502)), size: CGSize(width: (x/20), height: 2)) 
    CGContextStrokeRect(context, line) 
    let test = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: x, height: y)) 
    CGContextStrokeRect(context, test) 

    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return newImage 
} 

Update 2:
iPhone 6:
iPhone 6
iPhone 5:
iPhone 5

Я хочу, чтобы красная линия, чтобы показать в между комнатами, как в iPhone 6 скриншоте. В iPhone 5 он немного ниже.

Update 3:
печати просмотров изображений:
iPhone 5:

Нарисованные Изображение Вид: кадр = (0 0; 600 536); Изображение вида: frame = (0 0; 600 536);

iPhone 6:

Drawn Изображение Вид: кадра = (0 0; 600 536); Изображение вида: frame = (0 0; 600 536);

+0

Что такое 'x' и' y' в вашем обдуманном коде? нет никаких указаний и исходных значений. Вы вообще удалили цикл 'for'? Что именно не так на iPhone 5 по сравнению с iPhone 6? – alexburtnik

+0

распечатать рамку изображения для обоих устройств прямо перед тем, как вы вызовете метод «draw» и укажите здесь здесь. – alexburtnik

+0

Обновлено в вопросе ** Обновление 3 ** – caleb

ответ

1

Попробуйте заменить эту строку:

UIGraphicsBeginImageContext(img.size) 

с этим:

UIGraphicsBeginImageContextWithOptions(img.size, false, UIScreen.main.scale) 

Не ясно, почему вы используете 100 и 1200 harcoded значения. если ваше исходное изображение достаточно велико (выше 3000 или более 1200), ваши строки не будут заполнять все изображение. Также вам не нужно оригинальное изображение для создания наложения. Вам просто нужно знать размер, не так ли?Попробуйте этот метод вместо:

func createLinesImage(size: CGSize) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale) 
    let context = UIGraphicsGetCurrentContext()! 

    let color = UIColor(red: 0.67, green: 0.4, blue: 0.56, alpha: 1) 
    context.setStrokeColor(color.cgColor) 
    context.setLineWidth(2.0) 

    var y = CGFloat(0) 
    while y < size.height { 
     let lineRect = CGRect(x: 0, y: y, width: size.width, height: 1) 
     context.stroke(lineRect) 
     y += 30 
    } 

    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return newImage! 
} 

Теперь, если вы хотите, чтобы рисовать линии только по исходному изображению, вызовите ваш метод следующим образом:

imageView2.image = createLinesImage(size: originalImage.size) 

enter image description here

Если вам нужно заполнить целое изображениеView с линиями, даже если для исходного изображения есть пустые зоны, используйте эту строку:

imageView2.image = createLinesImage(size: imageView2.bounds.size) 

enter image description here

+0

UIScreen не имеет члена «main» – caleb

+0

Используете ли вы быстрый 2? Попробуйте UIScreen.mainScreen(). Scale then – alexburtnik

+0

Не работает. Все, что он делает, это перемещение нарисованного изображения на несколько сотен пикселей ... – caleb