Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 429новых вакансий за сутки·55 639вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 676
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 396 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 776
  • Облачные технологии6 635
  • QA вакансии2 167
  • Android1 317
  • Инженер данных882
  • Продакт-менеджер317

Разработка

  • iOS1 230
  • Backend вакансии1 213
  • AI вакансии550
  • Fullstack вакансии502
  • Frontend вакансии422
  • Mobile вакансии28

По стеку

  • Go5 214
  • Java3 144
  • Kotlin1 117
  • Node.js1 005
  • Rust847
  • .NET660
  • PHP319
  • C++268
  • C#208

DevOps и инфраструктура

  • Kubernetes3 918
  • Linux-инфраструктура2 844
  • DevOps вакансии2 687
  • Terraform / IaC2 172
  • Мониторинг и Observability1 067
  • CI/CD917
  • SRE309
  • Кибербезопасность33

Аналитика и данные

  • Аналитик данных539
  • Data Scientist446
  • Бизнес-аналитик404
  • Системный аналитик68

Другие направления

  • Проджект-менеджер105
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США26 310
  • Вакансии в Европе10 449
  • Работа в России3 624
  • Вакансии в Канаде2 314

По формату

  • Удалённые вакансии43 704
  • Релокация в США26 310
  • Гибридная работа5 625
  • Офисная работа4 427

По уровню

  • Senior вакансии22 877
  • Middle вакансии11 791
  • Junior вакансии3 906

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise187 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме SwiftUIВсе вопросы
SwiftUIMiddleТеория

Что такое matchedGeometryEffect и как он используется?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

matchedGeometryEffect синхронизирует позицию и размер двух View с одинаковым id в одном @Namespace, создавая плавный shared-element переход — карточка «летит» в детальный экран и обратно.

Пример: карточка, раскрывающаяся в детальный экран

struct Item: Identifiable {
    let id: Int
    let title: String
    let color: Color
}

struct HeroTransitionView: View {
    @Namespace private var animation
    @State private var selectedItem: Item? = nil

    let items: [Item] = [
        Item(id: 1, title: "Swift", color: .orange),
        Item(id: 2, title: "Python", color: .blue),
        Item(id: 3, title: "Kotlin", color: .purple)
    ]

    var body: some View {
        ZStack {
            // Сетка карточек
            ScrollView {
                LazyVGrid(columns: [GridItem(.adaptive(minimum: 150))]) {
                    ForEach(items) { item in
                        if selectedItem?.id != item.id {
                            CardView(item: item)
                                .matchedGeometryEffect(id: item.id, in: animation)
                                .onTapGesture {
                                    withAnimation(.spring(response: 0.5, dampingFraction: 0.8)) {
                                        selectedItem = item
                                    }
                                }
                        }
                    }
                }
                .padding()
            }

            // Детальный экран
            if let item = selectedItem {
                DetailView(item: item)
                    .matchedGeometryEffect(id: item.id, in: animation)
                    .ignoresSafeArea()
                    .onTapGesture {
                        withAnimation(.spring(response: 0.5, dampingFraction: 0.8)) {
                            selectedItem = nil
                        }
                    }
            }
        }
    }
}

struct CardView: View {
    let item: Item
    var body: some View {
        item.color
            .frame(height: 100)
            .cornerRadius(12)
            .overlay(Text(item.title).foregroundColor(.white).bold())
    }
}

struct DetailView: View {
    let item: Item
    var body: some View {
        item.color
            .overlay(
                VStack {
                    Text(item.title)
                        .font(.largeTitle.bold())
                        .foregroundColor(.white)
                    Text("Нажмите, чтобы закрыть")
                        .foregroundColor(.white.opacity(0.7))
                }
            )
    }
}

matchedGeometryEffect в SwiftUI

matchedGeometryEffect — модификатор, который синхронизирует геометрию (позицию и размер) двух View в разных частях иерархии. SwiftUI интерполирует фрейм одного View к фрейму другого, создавая плавный shared-element transition — переход, при котором элемент «летит» из одного места в другое.

Как это работает

Модификатор требует два параметра:

  • id — уникальный идентификатор пары View;
  • in — пространство имён (@Namespace), которое связывает пару вместе.

Пространство имён создаётся как @Namespace private var animation и передаётся в оба View. SwiftUI находит View с одинаковыми id в одном пространстве имён и анимирует переход между ними.

Параметр isSource

По умолчанию оба View являются источником геометрии. Параметр isSource: false говорит SwiftUI, что данный View должен принять геометрию от парного View, а не отдавать свою:

// View-источник определяет итоговую позицию
Text("Hero")
    .matchedGeometryEffect(id: "hero", in: ns, isSource: true)

// View-получатель адаптируется под позицию источника
Text("Hero")
    .matchedGeometryEffect(id: "hero", in: ns, isSource: false)

Анимация табов

struct TabSelector: View {
    @Namespace private var tabAnimation
    @State private var activeTab = 0
    let tabs = ["Работа", "Компании", "Профиль"]

    var body: some View {
        HStack {
            ForEach(tabs.indices, id: \.self) { index in
                Button(tabs[index]) {
                    withAnimation(.easeInOut(duration: 0.2)) {
                        activeTab = index
                    }
                }
                .padding(.vertical, 8)
                .padding(.horizontal, 16)
                .background {
                    if activeTab == index {
                        Capsule()
                            .fill(Color.accentColor)
                            .matchedGeometryEffect(id: "tab-indicator", in: tabAnimation)
                    }
                }
                .foregroundColor(activeTab == index ? .white : .primary)
            }
        }
        .padding(4)
        .background(Color(.systemGray6), in: Capsule())
    }
}

Подводные камни

  • Оба View должны существовать одновременно в иерархии — если оба View скрыты или только один из них рендерится, анимация не произойдёт; используйте opacity(0) вместо условного исключения из иерархии.
  • @Namespace должен принадлежать общему родителю — нельзя передавать Namespace между независимыми экранами через NavigationStack; для этого нужно поднять состояние выше.
  • Конфликт нескольких View с одинаковым id — два View с одинаковым id в одном namespace вызывают предупреждение и непредсказуемое поведение анимации.
  • Не работает через NavigationStack без дополнительных усилий — стандартный push-transition перекрывает matchedGeometryEffect; нужен кастомный контейнер через ZStack.
  • Производительность при большом числе пар — каждая пара с одинаковым namespace участвует в layout pass; при десятках пар это заметно нагружает рендер.
  • withAnimation обязателен — без обёртки изменений в withAnimation переход произойдёт мгновенно без интерполяции геометрии.
  • Clip-контейнеры обрезают анимацию — если родительский View имеет .clipped() или .cornerRadius() без .clipShape, анимирующийся View будет обрезан по границе родителя.

Частые вопросы на собеседовании

  • Как SwiftUI перерисовывает (re-render) представления и что вызывает обновление view?
  • В чём разница между @State, @Binding, @ObservedObject и @StateObject?
  • Как async/await интегрируется с представлениями SwiftUI через модификатор .task?
  • Как работает NavigationStack в SwiftUI и чем он отличается от NavigationView?

Типичные ошибки

  • Сводить «matchedGeometryEffect и как он используется» к синтаксису и не объяснять environment.
  • Игнорировать жизненный цикл, основной поток или момент освобождения ресурсов в сценарии swiftui-13.
  • Выбирать API по привычке, не проверяя состояние, ошибки, доступность и платформенные ограничения.

Что проверяет интервьюер

  • Формулирует точную модель для «matchedGeometryEffect и как он используется» и подтверждает ее корректным примером.
  • Умеет связать ответ с main actor, тестированием и отладкой на устройстве.
  • Называет ограничения подхода swiftui-13, включая производительность, память и сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме SwiftUI →

Источники

  • https://developer.apple.com/documentation/swiftui/view/matchedgeometryeffect
←Предыдущий вопросВ чём разница между `List` и `LazyVStack` в SwiftUI?Следующий вопрос→Какие архитектурные решения SwiftUI задаёт вокруг UI state, lifecycle, navigation, threading и platform integration?

Связанные темы

SwiftUIframework-api-designMobile-Engineering