Вопрос:

Якорная точка в SwiftUI

ios swift animation uikit swiftui

41 просмотра

1 ответ

1602 Репутация автора

Я играю с SwiftUIанимацией. Я хотел сделать квадрат больше, модифицируя его кадр анимацией следующим образом:

struct ContentView: View {
    let squareWidth = CGFloat(100)
    let squareHeight = CGFloat(100)

    @State private var bigger = false

    var body: some View {
        VStack {
            Color.green
                .frame(width: bigger ? self.squareWidth * 2 : self.squareWidth, height: self.squareHeight)
                .animation(.default)
            Button(action: {
                    self.bigger.toggle()
            }) {
                Text("Click me!")
            }
        }
    }
}

Анимация происходит из центра вида, то есть точки привязки (0,5, 0,5). Есть ли способ изменить эту точку привязки? Я обнаружил, что я могу использовать scaleEffectв представлении, указав anchor:

struct ContentView: View {
    let squareWidth = CGFloat(100)
    let squareHeight = CGFloat(100)

    @State private var bigger = false

    var body: some View {
        VStack {
            Color.green
                .frame(width: self.squareWidth, height: self.squareHeight)
                .scaleEffect(x: bigger ? 2 : 1, y: 1, anchor: .leading)
                .animation(.default)
            Button(action: {
                    self.bigger.toggle()
            }) {
                Text("Click me!")
            }
        }
    }
}

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

var myView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
myView.layer.anchorPoint = CGPoint(x: 0, y: 0.5) //that is, the .leading of SwiftUI
Автор: superpuccio Источник Размещён: 10.08.2019 02:27

Ответы (1)


0 плюса

688 Репутация автора

Это возможно, но ваш подход должен измениться.

В SwiftUI подразумевается встроенное центрирование представлений, которое может сбивать с толку.

Родительский вид - это тот, который размещает контент в центре, пересчитывая положение его подпредставлений каждый раз, когда их кадры меняются.

Встраивание VStack в HStack и добавление границ к обоим ясно показывает это поведение.

Также обратите внимание на то Spacer(), что сдвигает вид влево.

        HStack {
            VStack {
                Color.green
                    .frame(width: bigger ? self.squareWidth * 2 : self.squareWidth)
                    .frame(height: self.squareHeight)
                    .animation(.default)

                Button("Click me!") { self.bigger.toggle() }
            }.border(Color.black)

            Spacer()

        }.border(Color.red)

Использование .layer.anchorPointin UIKit должно иметь тот же эффект, что и scaleEffect / offset / вращениеEffect в SwiftUI, поскольку оно должно влиять на происхождение базовой геометрии / текстуры, которая отображается графическим процессором.

Если у вас есть сложное представление (состоящее из нескольких подпредставлений), для которого требуется одинаковый эффект масштабирования, вы можете сгруппировать их с помощью Group { }и использовать .scaleEffect для него.

Автор: Vlad Lego Размещён: 11.08.2019 07:41
Вопросы из категории :
32x32