Каков наилучший способ повернуть представление в swift и преобразовать его в изображение? - PullRequest
0 голосов
/ 21 февраля 2020

Мне было дано задание создать динамический c «билет» в Swift. Мне передали номер билета, сумму и т. Д. c от API наших серверов, и я должен сгенерировать штрих-код вместе со всеми метками, связанными с этим билетом. Я могу генерировать все необходимые данные без каких-либо проблем.

Проблема

Проблема возникает с ее выкладкой. Мне нужно иметь эскиз для этого билета, а также полноэкранный режим. Похоже, что это лучше всего сделать путем преобразования вида в изображение (верно?), Поскольку оно позволяет использовать такие функции, как масштабирование, наличие миниатюр и т. Д. c. Основной причиной проблемы является ярлыки билетов и штрих-код должны быть расположены вертикально или в основном в альбомном режиме.

Что я пробовал

UIGraphicsBeginImageContext

Я создал изображение вручную с UIGraphicsBeginImageContext() и связанными API. Это позволяет мне переворачивать каждый вид и преобразовывать его в изображение. Однако этот метод вынуждает меня вручную создавать рамку для каждого вида и теряет всю точность, и это не похоже на правильный способ сделать это, когда мне нужно добавить 10-15 меток к пустому изображению.

AutoLayout

Затем я попытался выложить все в UIView с autolayout и применить CGAffineTransform к каждому виду, а затем преобразовать весь вид в изображение. Кажется, это работает за исключением того, что я теряю точность и не могу правильно выстроить представления. CGAffineTransform полностью отбрасывает ограничения, и мне приходится экспериментировать с константами ограничений, пока я не получу представление, выглядящее несколько правильно, и даже в этом случае это не слишком хорошо переводит все размеры устройства.

Режим ландшафта

Наконец, я попытался выложить виды в обычном режиме и перевести вид в ландшафтный режим. Помимо количества проблем, которые возникли из-за того, что мое приложение поддерживает только портретный режим, я заставил его работать при представлении представления, но я понятия не имею, как получить представление в виде миниатюр, которое должно отображаться до представления представления заявки. быть в ландшафтном режиме. Если я попытаюсь сделать это, миниатюра получится в портретном режиме, а не в альбомной.

У вас, ребята, есть идеи по поводу лучшего способа сделать это sh или я должен придерживаться одного из методов, которые я пробовал, и пытаться устранить все ошибки? Я могу предоставить код по мере необходимости, но есть много чего, поэтому я не хотел просто добавлять сюда весь код, если в этом не было необходимости.

Ниже приведен пример того, что мне нужно создать, за исключением того, что мне нужно добавить туда дополнительные ярлыки, такие как дата выпуска, срок действия и т. Д. c:

enter image description here

Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 22 февраля 2020

Вы спросили:

Как лучше всего повернуть представление в swift и преобразовать его в изображение?

Если вы хотите создать повернутый снимок вида, примените rotate и translateBy к контексту:

func clockwiseSnapshot(of subview: UIView) -> UIImage {
    var rect = subview.bounds
    swap(&rect.size.width, &rect.size.height)
    return UIGraphicsImageRenderer(bounds: rect).image { context in
        context.cgContext.rotate(by: .pi / 2)
        context.cgContext.translateBy(x: 0, y: -rect.width)
        subview.drawHierarchy(in: subview.bounds, afterScreenUpdates: true)
    }
}

или

func counterClockwiseSnapshot(of subview: UIView) -> UIImage {
    var rect = subview.bounds
    swap(&rect.size.width, &rect.size.height)
    return UIGraphicsImageRenderer(bounds: rect).image { context in
        context.cgContext.rotate(by: -.pi / 2)
        context.cgContext.translateBy(x: -rect.height, y: 0)
        subview.drawHierarchy(in: subview.bounds, afterScreenUpdates: true)
    }
}

Очевидно, если вы хотите, чтобы Data был связан вместо этого используйте pngData или jpegData вместо:

func clockwiseSnapshotData(of subview: UIView) -> Data {
    var rect = subview.bounds
    swap(&rect.size.width, &rect.size.height)
    return UIGraphicsImageRenderer(bounds: rect).pngData { context in
        context.cgContext.rotate(by: .pi / 2)
        context.cgContext.translateBy(x: 0, y: -rect.width)
        subview.drawHierarchy(in: subview.bounds, afterScreenUpdates: true)
    }
}

или

func counterClockwiseSnapshotData(of subview: UIView) -> Data {
    var rect = subview.bounds
    swap(&rect.size.width, &rect.size.height)
    return UIGraphicsImageRenderer(bounds: rect).pngData { context in
        context.cgContext.rotate(by: -.pi / 2)
        context.cgContext.translateBy(x: -rect.height, y: 0)
        subview.drawHierarchy(in: subview.bounds, afterScreenUpdates: true)
    }
}

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

someView.transform = .init(rotationAngle: .pi / 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...