Почему модификатор SwiftUI onTapGuesture {} не запускается на повернутом прямоугольнике - PullRequest
1 голос
/ 08 апреля 2020

Если я создаю прямоугольник, скажем, шириной 100 и высотой 20, а затем поворачиваю его на 90 градусов, модификатор onTapGuesture {} не будет вызван, если я нажму на прямоугольник рядом с верхом или низом.

Кажется, что contentShape () может не соответствовать повернутому прямоугольнику

let fixView = Rectangle()
            .rotation(self.fixture.currentAngle)
            .fill(self.fixture.color)
            .overlay(Rectangle().rotation(self.fixture.currentAngle).stroke(self.fixture.borderColor, lineWidth: self.fixture.borderWidth).frame(width: overlayWidth, height: overlayHeight))
            .frame(width: width, height: height)
            .position(x: x, y: y )

            .onTapGesture {
                GlobalData.shared.selectedFixture = self.fixture.object
        }

Я считаю, что то же самое происходит с .onHover {} - он срабатывает, когда мышь находится над прямоугольником рамки фигур.

1 Ответ

0 голосов
/ 08 апреля 2020

rotation не меняет исходный кадр макета, который принимает жесты, поэтому вы должны сделать это явно, используя .contentShape, как показано ниже

Rectangle()
    .rotation(self.fixture.currentAngle)
    .fill(self.fixture.color)
    .overlay(Rectangle().rotation(self.fixture.currentAngle).stroke(self.fixture.borderColor, lineWidth: self.fixture.borderWidth).frame(width: overlayWidth, height: overlayHeight))
    .frame(width: width, height: height)
    // << here !! NB to not put this line after .position()
    .contentShape(Rectangle().rotation(self.fixture.currentAngle))  
    .position(x: x, y: y )

    .onTapGesture {
        GlobalData.shared.selectedFixture = self.fixture.object
}

Протестировано с Xcode 11.4 / iOS 13.4

Примечание: обратите внимание, что тестирование на удар работает только для непрозрачных деталей (на случай, если некоторые ваши цвета прозрачны)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...