ErrorNil. iOS-разработка
688 subscribers
298 photos
60 videos
17 files
332 links
Пишем код, разрабатываем приложения, учимся

Сайт школы https://error-nil.namari.ru/
YouTube https://www.youtube.com/@errornil
VK Видео - https://vk.com/video/@errornil

По всем вопросам пишите мне @ibatyrgereev
Download Telegram
Мой App Store 🔥

Какие то приложения полезные, какие-то по приколу, но все рабочие

И при том что 3 приложения только за этот год, если в этот месяц релизну еще одно приложение (а уже есть идея), то получится по проекту за кажды месяц))

И это одна из причин, почему я люблю разработку, можно превратить любую задумку в реальность, всего лишь написав правильный код!
👍13🔥11❤4
Кстати последний проект, сделал между делом для знакомого хирурга, учет своих пациентов, может кому тоже пригодится, все бесплатно
🔥9👍2
imageGenerate.zip
23.5 KB
Проект с последнего видео 👆
❤6⚡4🎉3
📎 Проект с предыдущего видео
🔥8❤2💯1
1. Создание своего шаблона

Перейти в директорию


~/Library/Developer/Xcode


Затем создать новый путь


/Templates/File Templates/Custom/


И внутри создать папку


CleanViewController.xctemplate
где CleanViewController любое название


Внутри этой папки создать два файла:
- ___FILEBASENAME___.swift и добавить нужный код, к примеру:


final class ___FILEBASENAME___: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
}
}


- TemplateInfo.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

<key>Description</key>
<string>Clean UIViewController</string>

<key>Kind</key>
<string>Xcode.IDEFoundation.TextSubstitutionFileTemplateKind</string>

<key>MainTemplateFile</key>
<string>___FILEBASENAME___.swift</string>

<key>Platforms</key>
<array>
<string>com.apple.platform.iphoneos</string>
</array>

</dict>
</plist>


2 - Своя шапка для всех файлов

- Перейти в директорию


~/Library/Developer/Xcode/UserData/


- Создать файл IDETemplateMacros.plist

- Добавить содержимое
-

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://apple.com">
<plist version="1.0">
<dict>
<key>FILEHEADER</key>
<string>Любой текст</string>
</dict>
</plist>


Доступные константы

___DATE___ — Текущая дата (например, 20.05.2024).
___YEAR___ — Текущий год.
___ORGANIZATIONNAME___ — Название организации (указано в настройках проекта).
___FILENAME___ — Имя создаваемого файла.
___USERNAME___ — Имя пользователя Mac.
🔥10❤6
Откликнуться, вдруг повезет
⚡12🔥8🤣6👍1
Media is too big
VIEW IN TELEGRAM
Смысла мало, зато бесплатно)

Полноценный локальный, БЕСПЛАТНЫЙ LLM.

Редкий кейс, но под определенные задачи все равно можно использовать, к примеру, при разработке, чтобы проверить конечную интеграцию с OpenAI API и не тратить токены
⚡8❤3👍3🔥1💯1
📱 Начинаем новый цикл разработки.

В этот раз приложения со списком покупок.

По традиции анонс и в дальнейшем этапы разработки будут выходить на канале, можно поддержать одним лайком 👍
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤7⚡2💯2🔥1
не спрашивайте
🤣22🔥8
И код для кастомного Layout из видео


struct FlowLayout: Layout {
var spacing: CGFloat = 12

func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize {
let maxWidth = proposal.width ?? .infinity
var rowWidth: CGFloat = 0
var rowHeight: CGFloat = 0
var totalHeight: CGFloat = 0

for subview in subviews {
let size = subview.sizeThatFits(.unspecified)
if rowWidth + size.width > maxWidth, rowWidth > 0 {
totalHeight += rowHeight + spacing
rowWidth = size.width + spacing
rowHeight = size.height
} else {
rowWidth += size.width + spacing
rowHeight = max(rowHeight, size.height)
}
}
totalHeight += rowHeight
return CGSize(width: maxWidth, height: totalHeight)
}

func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) {
var x = bounds.minX
var y = bounds.minY
var rowHeight: CGFloat = 0

for subview in subviews {
let size = subview.sizeThatFits(.unspecified)
if x + size.width > bounds.maxX, x > bounds.minX {
x = bounds.minX
y += rowHeight + spacing
rowHeight = 0
}
subview.place(at: CGPoint(x: x, y: y),
anchor: .topLeading,
proposal: ProposedViewSize(size))
x += size.width + spacing
rowHeight = max(rowHeight, size.height)
}
}
}
❤7
Golden Gate
⚡4
Умная Siri, опять?
👍11