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

+661новая вакансия за сутки·58 731вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python11 079
  • Облачные технологии4 127
  • QA вакансии1 598
  • Android1 395
  • Инженер данных767
  • Продакт-менеджер295

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C#211
  • C++206

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

  • DevOps вакансии3 024
  • Kubernetes2 336
  • Linux-инфраструктура1 899
  • Terraform / IaC1 428
  • CI/CD848
  • Мониторинг и Observability650
  • SRE220
  • Кибербезопасность35

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

  • Аналитик данных464
  • Data Scientist434
  • Бизнес-аналитик337
  • Системный аналитик48

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

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

По регионам

  • Вакансии в США23 332
  • Вакансии в Европе9 074
  • Работа в России2 931
  • Вакансии в Канаде2 054

По формату

  • Удалённые вакансии40 752
  • Релокация в США23 332
  • Гибридная работа3 446
  • Офисная работа2 568

По уровню

  • Senior вакансии19 645
  • Middle вакансии11 602
  • Junior вакансии3 620

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

Все компании
  • Wise196 вакансий
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify38 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Как использовать GeometryReader в SwiftUI и каковы его подводные камни?

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

GeometryReader предоставляет дочерним View доступ к размерам контейнера через GeometryProxy (.size, .safeAreaInsets, .frame(in:)), но занимает всё доступное пространство и может вызывать лишние перерисовки.

Базовое использование

struct RelativeCard: View {
    var body: some View {
        GeometryReader { proxy in
            VStack {
                // Карточка занимает 80% доступной ширины
                RoundedRectangle(cornerRadius: 12)
                    .fill(Color.blue)
                    .frame(
                        width: proxy.size.width * 0.8,
                        height: proxy.size.height * 0.4
                    )
                    .position(
                        x: proxy.size.width / 2,
                        y: proxy.size.height / 2
                    )
            }
        }
    }
}

GeometryReader в SwiftUI

GeometryReader — контейнерный View, который предоставляет дочерним View информацию о доступном пространстве через объект GeometryProxy. Он занимает всё предложенное ему пространство (flexible sizing) и передаёт его размеры внутрь через замыкание.

GeometryProxy API

Объект GeometryProxy предоставляет три основных свойства:

  • proxy.size — CGSize с доступной шириной и высотой;
  • proxy.safeAreaInsets — вставки безопасной зоны (EdgeInsets);
  • proxy.frame(in:) — фрейм в заданной системе координат (.global, .local, .named()).
struct OffsetTracker: View {
    @State private var offsetY: CGFloat = 0

    var body: some View {
        ScrollView {
            GeometryReader { proxy in
                Color.clear
                    .preference(
                        key: ScrollOffsetKey.self,
                        value: proxy.frame(in: .named("scroll")).minY
                    )
            }
            .frame(height: 0)

            ForEach(0..<50) { i in
                Text("Item \(i)")
                    .padding()
            }
        }
        .coordinateSpace(name: "scroll")
        .onPreferenceChange(ScrollOffsetKey.self) { offsetY = $0 }
        .overlay(Text("Offset: \(Int(offsetY))"), alignment: .top)
    }
}

struct ScrollOffsetKey: PreferenceKey {
    static var defaultValue: CGFloat = 0
    static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
        value = nextValue()
    }
}

Паттерн с PreferenceKey

Классический способ «пробросить» размер из дочернего View к родителю — GeometryReader + PreferenceKey. Это позволяет выровнять несколько View по одной высоте:

struct EqualHeightCards: View {
    @State private var maxHeight: CGFloat = 0

    var items = ["Short", "A very long text that wraps", "Medium text"]

    var body: some View {
        HStack(alignment: .top, spacing: 16) {
            ForEach(items, id: \.self) { text in
                Text(text)
                    .padding()
                    .background(
                        GeometryReader { proxy in
                            Color.clear.preference(
                                key: HeightKey.self,
                                value: proxy.size.height
                            )
                        }
                    )
                    .frame(height: maxHeight == 0 ? nil : maxHeight)
                    .background(Color.gray.opacity(0.2))
                    .cornerRadius(8)
            }
        }
        .onPreferenceChange(HeightKey.self) { maxHeight = $0 }
    }
}

struct HeightKey: PreferenceKey {
    static var defaultValue: CGFloat = 0
    static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
        value = max(value, nextValue())
    }
}

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

  • GeometryReader занимает всё доступное пространство — в отличие от большинства View он расширяется до максимума, что ломает компоновку при использовании внутри HStack/VStack без явного frame.
  • Вложенные GeometryReader вызывают layout-циклы — каждый уровень вложенности может провоцировать лишние проходы компоновки; минимизируйте вложенность.
  • Использование в List/LazyVStack — при прокрутке GeometryReader внутри ячейки пересчитывает размеры на каждый frame, что сильно нагружает CPU.
  • proxy.size не обновляется при анимации — значение фиксируется в момент рендера; для анимированных размеров используйте .matchedGeometryEffect или явные анимации через withAnimation.
  • Начальный размер = CGSize.zero — в первый рендер proxy.size может быть нулевым, что вызывает мигание. Защищайтесь через if proxy.size.width > 0.
  • Избыточное использование вместо ViewThatFits — в iOS 16+ для адаптации под доступное пространство лучше использовать ViewThatFits, который не захватывает всё пространство.
  • frame(in: .global) возвращает позицию в момент рендера — при прокрутке значение устаревает мгновенно; для отслеживания прокрутки нужен coordinateSpace(name:).

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

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

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

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

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

  • Формулирует точную модель для «использовать GeometryReader в SwiftUI и каковы его подводные камни» и подтверждает ее корректным примером.
  • Умеет связать ответ с инвалидация body, тестированием и отладкой на устройстве.
  • Называет ограничения подхода swiftui-10, включая производительность, память и сопровождение.

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

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

Источники

  • https://developer.apple.com/documentation/swiftui/geometryreader
←Предыдущий вопросПредставьте, экран на SwiftUI тормозит, теряет состояние или ведёт себя по-разному на разных платформах. Как вы будете искать причину?Следующий вопрос→Что такое протокол `Identifiable` и почему он требуется для `ForEach`?

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

SwiftUIimplementation-reasoningMobile-Engineering