Danny Behar's Avatar

Danny Behar

@dannybehar.me

iOS Dev πŸ§‘πŸ»β€πŸ’» | Musician 🎷 | Dog Dad 🐢 Building Tutti, a sheet music reader for iPad: https://apps.apple.com/us/app/sheet-music-reader-tutti/id6475010738 Baltimore, MD

1,004
Followers
341
Following
135
Posts
14.06.2023
Joined
Posts Following

Latest posts by Danny Behar @dannybehar.me

NavigationSplitView has its own chapter πŸ˜…

04.01.2026 10:47 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

ALSO, here is a link to my SwiftUI wrapper for PDFKit's PDFView. It's open-source and lets you test out some of these techniques in practice. 😎

github.com/DannyBehar/P...

15.12.2025 15:08 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
DC iOS: Building a UIKit Powered SwiftUI API
DC iOS: Building a UIKit Powered SwiftUI API YouTube video by Dev Community

My first full-length talk is live on YouTube! Learn some techniques for wrapping UIKit components with SwiftUI for ease of use and reusability. Thank you, DevCommunity and DC iOS, for hosting me for my first full-length talk!

www.youtube.com/watch?v=8z2A...

15.12.2025 15:07 πŸ‘ 3 πŸ” 0 πŸ’¬ 1 πŸ“Œ 1

Yea exactly. In my experience I’ve just used it as a means to get access to that SwiftUI state from the coordinator.

10.12.2025 11:13 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

You could also pass in an EnvironmentObject or a Bindable if you are using SwiftUI Observable. Take a look at this link: GitHub.com/dannybehar/PDFViewer

10.12.2025 11:00 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Perhaps you could inject this event array into your representable using an environment value. Or if your UIKit component needs to update this array, maybe you could use a Binding

10.12.2025 11:00 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

But the useful thing the parent can access is the β€˜state’ that is attached to that descriptor. Things like a Binding which is stored separately from the view description and managed by SwiftUI or environment values which are read only props injected into view hierarchy.

10.12.2025 11:00 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

I just gave a talk on this topic last night at the DC iOS meetup! Will post a link to a PDFView wrapper that I sent everyone home with. I think of it like the SwiftUI view structs are kind of like descriptor metadata, they describe the view and our being recreated a bunch since they are value types.

10.12.2025 11:00 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Wohoo!! πŸŽ‰ Congrats Stephen!

31.10.2025 18:49 πŸ‘ 4 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Wow I didn’t even know about that modifier. I could also use that functionality but maybe I should hold off for now πŸ˜…

15.10.2025 19:33 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Yea it works if your device is running 18 or 17. the issue is when your device is running 26. Thanks for checking

16.09.2025 15:36 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Post image

Still no icon showing up for Tutti on the iPadOS 26 App Store.

Hurts to spend months working on a release and then have this happen. If you work for Apple and/or have any idea how to resolve, I'd appreciate the help <3

16.09.2025 15:22 πŸ‘ 7 πŸ” 1 πŸ’¬ 1 πŸ“Œ 1
Post image

Tutti 3.1 is now available on the App Store!

Updated for iPadOS 26 and Liquid Glass

Tutti makes it easy to organize, practice, and perform using your PDF sheet music!

Available on the iPadOS App Store here:
apps.apple.com/us/app/paper...

15.09.2025 15:21 πŸ‘ 4 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Video thumbnail

My app Tutti, a sheet music reader for iPad, has an update coming out Tomorrow (pending app review).

It’s being updated with the new design and Liquid Glass! If you read music, give it a try and let me know what you think!

Here is a video demo showing off the new design.

gettutti.app

14.09.2025 23:38 πŸ‘ 8 πŸ” 2 πŸ’¬ 0 πŸ“Œ 0

What are the deets for the speaker on the iPhone Air. Does it require headphones? I couldn't find anything on Apple's website about it.

11.09.2025 20:09 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Post image Post image Post image

The time has come! Sage RPG is here! πŸŽ‰

Sage RPG is a tabletop RPG management tool, built to help you keep track of and manage your homebrew characters, maps, notes and more. Take a look at some dev pics!

Built for iOS, iPadOS, Vision OS and MacOS!

TestFlight testflight.apple.com/join/MPP1GK1W

10.09.2025 22:18 πŸ‘ 5 πŸ” 2 πŸ’¬ 1 πŸ“Œ 1

If the AI consistently goes tries to go in a direction that I know is a dead-end, I'll update the overall project prompt to better steer it for future prompts. I'm starting to see the future of software development and I kind of like it?

10.08.2025 21:42 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

If I find a certain section that I don't understand, I'll pepper GPT-5 with specific questions to get a better sense.

10.08.2025 21:41 πŸ‘ 0 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

So I'm currently vibe coding a new PDF Viewer for Tutti that is built on top of the PDFKit utility classes. GPT-5 is so far doing really well. I've started to settle into a flow: Vibe code a small piece of functionality, and then review the code to find ways to simplify and reduce complexity.

10.08.2025 21:41 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

GPT-5 was super impressive this morning and now around lunch time EST it's acting more like GPT-3 and the website is barely responsive. Guessing there is huge demand with the new model being released. Anyone else experiencing the same?

09.08.2025 15:09 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

This is so epic πŸš€

25.07.2025 01:27 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
struct BottomView: View {
    @State private var isVisible = false
    var body: some View {
        VStack {
            Button("Show / Hide") {
                withAnimation(.bouncy) {
                    isVisible.toggle()
                }
            }
        }
        .frame(maxHeight: .infinity, alignment: .top)
        .safeAreaInset(edge: .bottom) {
            if isVisible {
                RoundedRectangle(cornerRadius: 16)
                    .fill(.pink)
                    .padding(.horizontal, 20)
                    .padding(.bottom, 20)
                    .frame(height: 100)
                    .transition(.move(edge: .bottom))
                    .padding(.top, 40)
            }
        }
    }
}

struct BottomView: View { @State private var isVisible = false var body: some View { VStack { Button("Show / Hide") { withAnimation(.bouncy) { isVisible.toggle() } } } .frame(maxHeight: .infinity, alignment: .top) .safeAreaInset(edge: .bottom) { if isVisible { RoundedRectangle(cornerRadius: 16) .fill(.pink) .padding(.horizontal, 20) .padding(.bottom, 20) .frame(height: 100) .transition(.move(edge: .bottom)) .padding(.top, 40) } } } }

I usually have to play around with the padding in order to get around this issue. Try something like this.. breaking up the padding before the transition and add back some top padding after the transition. This seems to have worked for me.

04.07.2025 20:23 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Video thumbnail

Tutti v3.0 is now available on the app store!

I've been working really hard on this update. So happy it's finally out in the world! It includes:

- A new split-view design
- Dark mode support across the app
- A new onboarding experience
- lots of smaller tweaks, animations, and bug fixes

27.06.2025 12:29 πŸ‘ 4 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

oooh... thats a great idea. I may try something similar for Tutti.

16.06.2025 19:34 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
struct DrawAnimationView: View {
    var isShowing: Bool
    var icon: String
    var color: any ShapeStyle
    var drawOnEffect: DrawOnSymbolEffect = .drawOn
    var speed: Double = 1.0
    var body: some View {
        VStack(spacing: 24) {
            Image(systemName: icon)
                .font(.system(size: 400))
                .imageScale(.large)
                .foregroundStyle(AnyShapeStyle(color))
                .symbolEffect(drawOnEffect,
                              options: .speed(speed),
                              isActive: isShowing)
        }
    }
}

struct DrawAnimationView: View { var isShowing: Bool var icon: String var color: any ShapeStyle var drawOnEffect: DrawOnSymbolEffect = .drawOn var speed: Double = 1.0 var body: some View { VStack(spacing: 24) { Image(systemName: icon) .font(.system(size: 400)) .imageScale(.large) .foregroundStyle(AnyShapeStyle(color)) .symbolEffect(drawOnEffect, options: .speed(speed), isActive: isShowing) } } }

And now the code! This is the code I used to make all of these examples. Pass in the color, icon string, effect, and speed:

16.06.2025 17:11 πŸ‘ 5 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Video thumbnail

Be creative. You can mix this effect with other features of SwiftUI to create wonderful experiences for your users.

16.06.2025 17:11 πŸ‘ 0 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Video thumbnail

This effect is flexible! For example, you can tell the effect to draw each layer individually by applying the symbol effect like this: .symbolEffect(.drawOn.individually,
isActive: isShowing)

16.06.2025 17:11 πŸ‘ 3 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Video thumbnail

Another great example: "scribble.variable" with a .green.gradient foregroundStyle. Showcasing another new addition to iOS 26. Gradient foregroundStyles on symbols!

16.06.2025 17:11 πŸ‘ 0 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Video thumbnail

The "signature" SFSymbol showcases this effect so well.

16.06.2025 17:11 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Video thumbnail

New in SFSymbols for iOS 26, Draw effects!!

Five beautiful examples.. stay till the end for the code sample.

First up, "rainbow" with .symbolRenderingMode(.multicolor). Symmetrical symbols draw outward from the center.

16.06.2025 17:11 πŸ‘ 26 πŸ” 4 πŸ’¬ 2 πŸ“Œ 0