Привет! 1. Правила: https://telegra.ph/Pravila-chata-SwiftBook-v-Telegram-12-21 2. Новости проекта: @swiftbook_news 3. Вакансии разработчиков: @swiftbook_job 4. Обучение разработке на Swift: http://bit.ly/45rvncx
🔌 Недоступны сервера App Store Connect - Analytics, App Store Connect - Sales and Trends, Apple Podcasts Connect. Проблемы начались 05.04.2025 в 00:33 GMT+3.
Читать полностью…Всем привет, может кто-то интегрировал себе какой факс API в аппу, есть пару вопросиков ?)
Читать полностью…Товар consumable, также все способы оплаты валидны ну добавлены, и всё работает у других людей, это вот одно исключение такое
Читать полностью…💻 Топ-5 репозиториев на GitHub за 4 апреля
openhaystack +55⭐
Build your own 'AirTags' 🏷 today! Framework for tracking personal Bluetooth devices via Apple's massive Find My network.
awesome-ios +15⭐
A curated list of awesome iOS ecosystem, including Objective-C and Swift Projects
IceCubesApp +9⭐
A SwiftUI Mastodon client
XcodesApp +9⭐
The easiest way to install and switch between multiple versions of Xcode - with a mouse click.
CopilotForXcode +9⭐
Xcode extension for GitHub Copilot
врапер то понтяно, я про нативные модификаторы
Читать полностью…Это тоже может работать на СУИ
Читать полностью…UITextField.appearance().keyboardAppearance = .dark
Читать полностью…как на sUI поменять цвет клавитауры на .dark?
Читать полностью…🐞 Сбой в App Store Connect - App Processing , Apple Music for Artists. Проблемы начались 03.04.2025 в 22:44 GMT+3.
Читать полностью…Ситуация чуть получше, если заменить LazyVSTack на VStack.
В таком случае визуально элмента больше нет, но NSView больше не обновляется
Appkit врапер:
Читать полностью…
struct ClickAction<Content: View>: NSViewRepresentable {
let content: Content
var onClick: (() -> Void)? = nil
init(
@ViewBuilder content: () -> Content,
onClick: (() -> Void)? = nil
) {
self.content = content()
self.onClick = onClick
}
func makeNSView(context: Context) -> SwipeActionContainerView<Content> {
let container = SwipeActionContainerView<Content>()
let hostingView = NSHostingView(rootView: content)
hostingView.translatesAutoresizingMaskIntoConstraints = false
container.addSubview(hostingView)
let swipeActionView = NSView()
swipeActionView.translatesAutoresizingMaskIntoConstraints = false
swipeActionView.wantsLayer = true
swipeActionView.layer?.backgroundColor = NSColor.red.cgColor
container.addSubview(swipeActionView)
let hostingViewLeadingConstraint = hostingView.leadingAnchor.constraint(equalTo: container.leadingAnchor)
let hostingViewTrailingConstraint = hostingView.trailingAnchor.constraint(equalTo: container.trailingAnchor)
let swipeActionViewLeadingConstraint = swipeActionView.leadingAnchor.constraint(equalTo: container.trailingAnchor)
let swipeActionViewTrailingConstraint = swipeActionView.trailingAnchor.constraint(equalTo: container.trailingAnchor)
NSLayoutConstraint.activate([
hostingViewLeadingConstraint,
hostingViewTrailingConstraint,
hostingView.topAnchor.constraint(equalTo: container.topAnchor),
hostingView.bottomAnchor.constraint(equalTo: container.bottomAnchor),
swipeActionViewLeadingConstraint,
swipeActionViewTrailingConstraint,
swipeActionView.centerYAnchor.constraint(equalTo: container.centerYAnchor),
swipeActionView.heightAnchor.constraint(equalTo: container.heightAnchor)
])
container.swipeActionViewLeadingConstraint = swipeActionViewLeadingConstraint
container.swipeActionViewTrailingConstraint = swipeActionViewTrailingConstraint
container.hostingViewLeadingConstraint = hostingViewLeadingConstraint
container.hostingViewTrailingConstraint = hostingViewTrailingConstraint
container.onClick = onClick
return container
}
func updateNSView(_ nsView: SwipeActionContainerView<Content>, context: Context) {
guard let hostingView = nsView.subviews.compactMap({ $0 as? NSHostingView<Content> }).first else { return }
hostingView.rootView = content
}
}
class SwipeActionContainerView<Content: View>: NSView {
var onClick: (() -> Void)? = nil
var swipeActionViewLeadingConstraint: NSLayoutConstraint?
var swipeActionViewTrailingConstraint: NSLayoutConstraint?
var hostingViewLeadingConstraint: NSLayoutConstraint?
var hostingViewTrailingConstraint: NSLayoutConstraint?
private var hostItemInitWidth: CGFloat = 0
override init(frame: NSRect) {
super.init(frame: frame)
addClickGestureRecognizer()
DispatchQueue.main.async {
self.hostItemInitWidth = self.bounds.width
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func addClickGestureRecognizer() {
let clickGestureRecognizer = NSClickGestureRecognizer(target: self, action: #selector(handleClickGesture))
self.addGestureRecognizer(clickGestureRecognizer)
}
@objc private func handleClickGesture(_ gestureRecognizer: NSClickGestureRecognizer) {
updateConstraintsOnClick()
}
private func updateConstraintsOnClick() {
self.swipeActionViewLeadingConstraint?.constant = -self.hostItemInitWidth
self.hostingViewLeadingConstraint?.constant = -self.hostItemInitWidth
self.hostingViewTrailingConstraint?.constant = -self.hostItemInitWidth
self.onClick?()
}
}
💻 Топ-5 репозиториев на GitHub за 3 апреля
IceCubesApp +30⭐
A SwiftUI Mastodon client
AeroSpace +21⭐
AeroSpace is an i3-like tiling window manager for macOS
XcodesApp +15⭐
The easiest way to install and switch between multiple versions of Xcode - with a mouse click.
Delta +14⭐
Delta is an all-in-one classic video game emulator for non-jailbroken iOS devices.
LiveContainer +7⭐
Run iOS app without actually installing it!
Декомпозировать можно и нужно. Как раз сейчас материал этот изучаю. Но по нему внятно объяснить ничего не готов в ближайшую неделю. Самому переварить надо. 🙂
Читать полностью…Вот пример накидал. Он рабоатет.
Читать полностью…
import SwiftUI
import Combine
class SubViewModel: ObservableObject {
@Published var text = "Tap to change!"
func update() {
text = "Updated!"
}
}
class GeneralViewModel: ObservableObject {
let subViewModel = SubViewModel()
private var subscriptions = Set<AnyCancellable>()
init() {
subViewModel.objectWillChange
.sink { [weak self] in
self?.objectWillChange.send()
}
.store(in: &subscriptions)
}
func update() {
subViewModel.update()
}
}
struct GeneralViewModelWithSubViewModelsContentView: View {
@ObservedObject var viewModel = GeneralViewModel()
var body: some View {
VStack {
Text(viewModel.subViewModel.text)
.onTapGesture {
viewModel.update()
}
}
}
}
#Preview {
GeneralViewModelWithSubViewModelsContentView()
}
🐞 Сбой в App Store Connect, App Store Connect - App Processing , Apple Music for Artists. Проблемы начались 05.04.2025 в 00:20 GMT+3.
Читать полностью…Привет, подскажите как сделать такую анимацию для лейбла на UIKit? Пока что в голову приходит только каждый символ на отдельный лейбл разбивать (fade + scale)
Читать полностью…Народ, подскажите тестируем аппку, и вот у 1 тестера вылезло такое, сейчас аппка в тестфлайт, и использует он свой аккаунт, да читал что не есть гуд использовать продакшен и сендбокс систему, но как есть
Читать полностью…Привет! На связи международное сообщество мобильных разработчиков - Coffee&Code.
Офлайн встречи мобильных разработчиков в формате дружеской беседы на этих выходных.
Мероприятия совершенно бесплатны,
ждём всех желающих, обсудить разработку, задать вопросы, поделиться опытом и знаниями.
🌆Города в которых пройдут встречи:
🤖 Android:
📍СПИСОК ГОРОДОВ
📱 Mobile:
📍СПИСОК ГОРОДОВ
🍏 iOS:
📍СПИСОК ГОРОДОВ
кто тебе мешает в swiftui использовать ?
Читать полностью…ну пиши TextField.keyboardAppearance(.dark)
Читать полностью…🍏 Устранили сбой в App Store Connect - App Processing , Apple Music for Artists. Сервисы работают нормально.
Читать полностью…Есть у кого-нибудь тема для xcode Алексея Ефимова? Сбросил мак и забыл сохранить себе
Читать полностью…То есть если нажать на кнопку
Button("refresh items") {
items = Array(1...5).map(\.description)
}
Йоу. Подскажите пожалуйста.
Я делаю кастомный врапер для SwiftUI на AppKit.
Когда я удаляю его и потом делаю ререндер элементов, то все равно тот AppKit элемент остается видимым.
Подскажите пожалуйста почему и что я упускаю...
Уже все обгуглил, обспрашивал и ChatGPT и Claude.
Читать полностью…
import SwiftUI
struct ContentView: View {
@State private var items: [String] = Array(1...5).map(\.description)
var body: some View {
Button("refresh items") {
items = Array(1...5).map(\.description)
}
ScrollView {
LazyVStack {
ForEach(items, id: \.self) { item in
ClickAction {
Text(item)
.padding(15)
.frame(maxWidth: .infinity, alignment: .leading)
.background(.blue)
} onClick: {
withAnimation(.linear) {
items.removeAll(where: {$0 == item})
}
}
.transition(.move(edge: .top))
}
}
}
}
}
а можешь линку кинуть на что изучаешь?)
Читать полностью…о, спасибо, сейчас попробую, т.е по факту как раз подписываемся на изменения из мелкой и обновляем глобальную
Читать полностью…вообще например у меня есть в общей вьюхе много мелких и надо чтобы они сами перерисовывались, на основании стейтов которые лежат в их вьюмоделях
стейты простые
- лоадинг
- не лоадинг
- еррор
на основании их мелкая вьюха показывает себя же в виде другой вьюхи
- шимер
- данные
- ошибка
можно ли такое реализовать на SUI?
потому что например если я обновлю общую вьюху то она обновит и все другие вьюхи?
например у меня у одной показывается шимер, у второй данные
будет ли это так работать?