Основная причина состоит в том, чтобы применить жест увеличения к зажатой части изображения. По умолчанию он работает отлично, но всегда увеличивает в центре/выходе данного изображения. Как манипулировать этим, чтобы увеличить фактическую часть изображения? Если я увеличиваю левый верхний угол изображения, он должен оставаться в том же месте, где эта часть изображения, которую я хочу увеличить. < /P>
Где проблема? Пока вы его ущипните, он неправильно масштабирует изображение. Кажется, что смещение рассчитывается правильно, но понятия не имею, почему это не работает. < /P>
перетаскивание работает отлично, а не увеличивать. Это все. < /P>
Вот мой код: < /p>
@available(iOS 17.0, *)
struct WrapperForCropView: View {
var image: UIImage //here you need to add any image from any source.
var body: some View {
ZStack {
Color.red
GeometryReader { proxy in
VStack {
DemoCroppingView(uiImage: image, bounds: proxy.size)
}
.frame(width: proxy.size.width, height: proxy.size.height)
.clipped()
}
}
}
}
@available(iOS 17.0, *)
struct DemoCroppingView: View {
var uiImage: UIImage
var bounds: CGSize
@State private var offsetLimit: CGSize = .zero
@State private var offset: CGSize = .zero
@State private var lastOffset: CGSize = .zero
@State private var scale: CGFloat = 1
@State private var lastScale: CGFloat = 1
@State private var imageViewSize: CGSize = .zero
private let mask = CGSize(width: 300, height: 300)
private var dragGesture: some Gesture {
DragGesture()
.onChanged { gesture in
offsetLimit = getOffsetLimit()
let width = min(
max(-offsetLimit.width, lastOffset.width + gesture.translation.width),
offsetLimit.width
)
let height = min(
max(-offsetLimit.height, lastOffset.height + gesture.translation.height),
offsetLimit.height
)
offset = CGSize(width: width, height: height)
}
.onEnded { _ in
lastOffset = offset
}
}
private var scaleGesture: some Gesture {
MagnifyGesture()
.onChanged { gesture in
let startX = gesture.startLocation.x
let startY = gesture.startLocation.y
let currentScale = lastScale * gesture.magnification
scale = currentScale
let offsetWidth = (startX - (startX - lastOffset.width) * scale)
let offsetHeight = (startY - (startY - lastOffset.height) * scale)
offset = CGSize(width: offsetWidth, height: offsetHeight)
}
.onEnded { _ in
lastScale = scale
lastOffset = offset
}
}
var body: some View {
ZStack(alignment: .center) {
ZStack {
Rectangle()
.fill(.black)
Image(uiImage: uiImage)
.resizable()
.scaledToFill()
.scaleEffect(scale)
.offset(offset)
}
.overlay {
Color.black.opacity(0.5)
}
Image(uiImage: uiImage)
.resizable()
.scaledToFill()
.scaleEffect(scale)
.offset(offset)
.mask(
Circle()
.frame(width: mask.width, height: mask.height)
)
.overlay {
Circle()
.stroke(Color.red, lineWidth: 1)
.frame(width: mask.width, height: mask.height)
}
}
.simultaneousGesture(dragGesture)
.simultaneousGesture(scaleGesture)
.clipped()
.onChange(of: bounds) { _, _ in
calculateImageViewSize()
}
.onChange(of: uiImage) { _, _ in
calculateImageViewSize()
lastOffset = .zero
offset = .zero
offsetLimit = .zero
}
}
private func calculateImageViewSize() {
let viewRatio = bounds.width / bounds.height
let width = uiImage.size.width
let height = uiImage.size.height
let imageRatio = width / height
let factor = viewRatio < imageRatio ? bounds.height / height : bounds.width / width
imageViewSize.height = height * factor
imageViewSize.width = width * factor
}
private func getOffsetLimit() -> CGSize {
var offsetLimit: CGSize = .zero
offsetLimit.width = ((imageViewSize.width * scale) - mask.width) / 2
offsetLimit.height = ((imageViewSize.height * scale) - mask.height) / 2
return offsetLimit
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... not-the-ce
Как использовать Swiftui MagnifyGesture, чтобы масштабировать зажатую часть изображения, а не центр? ⇐ IOS
Программируем под IOS
1759079504
Anonymous
Основная причина состоит в том, чтобы применить жест увеличения к зажатой части изображения. По умолчанию он работает отлично, но всегда увеличивает в центре/выходе данного изображения. Как манипулировать этим, чтобы увеличить фактическую часть изображения? Если я увеличиваю левый верхний угол изображения, он должен оставаться в том же месте, где эта часть изображения, которую я хочу увеличить. < /P>
Где проблема? Пока вы его ущипните, он неправильно масштабирует изображение. Кажется, что смещение рассчитывается правильно, но понятия не имею, почему это не работает. < /P>
перетаскивание работает отлично, а не увеличивать. Это все. < /P>
Вот мой код: < /p>
@available(iOS 17.0, *)
struct WrapperForCropView: View {
var image: UIImage //here you need to add any image from any source.
var body: some View {
ZStack {
Color.red
GeometryReader { proxy in
VStack {
DemoCroppingView(uiImage: image, bounds: proxy.size)
}
.frame(width: proxy.size.width, height: proxy.size.height)
.clipped()
}
}
}
}
@available(iOS 17.0, *)
struct DemoCroppingView: View {
var uiImage: UIImage
var bounds: CGSize
@State private var offsetLimit: CGSize = .zero
@State private var offset: CGSize = .zero
@State private var lastOffset: CGSize = .zero
@State private var scale: CGFloat = 1
@State private var lastScale: CGFloat = 1
@State private var imageViewSize: CGSize = .zero
private let mask = CGSize(width: 300, height: 300)
private var dragGesture: some Gesture {
DragGesture()
.onChanged { gesture in
offsetLimit = getOffsetLimit()
let width = min(
max(-offsetLimit.width, lastOffset.width + gesture.translation.width),
offsetLimit.width
)
let height = min(
max(-offsetLimit.height, lastOffset.height + gesture.translation.height),
offsetLimit.height
)
offset = CGSize(width: width, height: height)
}
.onEnded { _ in
lastOffset = offset
}
}
private var scaleGesture: some Gesture {
MagnifyGesture()
.onChanged { gesture in
let startX = gesture.startLocation.x
let startY = gesture.startLocation.y
let currentScale = lastScale * gesture.magnification
scale = currentScale
let offsetWidth = (startX - (startX - lastOffset.width) * scale)
let offsetHeight = (startY - (startY - lastOffset.height) * scale)
offset = CGSize(width: offsetWidth, height: offsetHeight)
}
.onEnded { _ in
lastScale = scale
lastOffset = offset
}
}
var body: some View {
ZStack(alignment: .center) {
ZStack {
Rectangle()
.fill(.black)
Image(uiImage: uiImage)
.resizable()
.scaledToFill()
.scaleEffect(scale)
.offset(offset)
}
.overlay {
Color.black.opacity(0.5)
}
Image(uiImage: uiImage)
.resizable()
.scaledToFill()
.scaleEffect(scale)
.offset(offset)
.mask(
Circle()
.frame(width: mask.width, height: mask.height)
)
.overlay {
Circle()
.stroke(Color.red, lineWidth: 1)
.frame(width: mask.width, height: mask.height)
}
}
.simultaneousGesture(dragGesture)
.simultaneousGesture(scaleGesture)
.clipped()
.onChange(of: bounds) { _, _ in
calculateImageViewSize()
}
.onChange(of: uiImage) { _, _ in
calculateImageViewSize()
lastOffset = .zero
offset = .zero
offsetLimit = .zero
}
}
private func calculateImageViewSize() {
let viewRatio = bounds.width / bounds.height
let width = uiImage.size.width
let height = uiImage.size.height
let imageRatio = width / height
let factor = viewRatio < imageRatio ? bounds.height / height : bounds.width / width
imageViewSize.height = height * factor
imageViewSize.width = width * factor
}
private func getOffsetLimit() -> CGSize {
var offsetLimit: CGSize = .zero
offsetLimit.width = ((imageViewSize.width * scale) - mask.width) / 2
offsetLimit.height = ((imageViewSize.height * scale) - mask.height) / 2
return offsetLimit
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79777467/how-to-use-swiftui-magnifygesture-to-scale-pinched-part-of-the-image-not-the-ce[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия