Sign in

Danny Behar

@dbehar.com
1K followers 346 following 135 posts

iOS Dev 🧑🏻‍💻 | Musician 🎷 | Dog Dad 🐶 Building Tutti, a sheet music reader for iPad: apps.apple.com/us/app/sheet-music-r… Baltimore, MD

PostsRepliesMedia
Danny Behar @dbehar.com · 16/09/2025
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
171
Danny Behar @dbehar.com · 15/09/2025
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...
040
Danny Behar @dbehar.com · 15/09/2025
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
082
Danny Behar @dbehar.com · 04/07/2025
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.
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)
            }
        }
    }
}
120
Danny Behar @dbehar.com · 27/06/2025
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
040
Danny Behar @dbehar.com · 16/06/2025
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:
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)
        }
    }
}
050
Danny Behar @dbehar.com · 16/06/2025
Be creative. You can mix this effect with other features of SwiftUI to create wonderful experiences for your users.
100
Danny Behar @dbehar.com · 16/06/2025
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)
130
Danny Behar @dbehar.com · 16/06/2025
Another great example: "scribble.variable" with a .green.gradient foregroundStyle. Showcasing another new addition to iOS 26. Gradient foregroundStyles on symbols!
100
Danny Behar @dbehar.com · 16/06/2025
The "signature" SFSymbol showcases this effect so well.
110
Danny Behar @dbehar.com · 16/06/2025
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.
2264
Danny Behar @dbehar.com · 14/05/2025
Tutti's onboarding flow is coming along nicely! I'm noticing that I really enjoy animating SF Symbols.. Should I animate all of them? 🤩
040
Danny Behar @dbehar.com · 21/04/2025
And here is the view which calls this custom label style:
struct ContentView: View {
   @State private var isExpanded = true
    
    var body: some View {
        VStack(spacing: 24) {
            Label("Good Morning", systemImage: "sun.max")
                .labelStyle(ExpandableLabelStyle(isExpanded: isExpanded))
            
            Button("Toggle Label Style") {
                isExpanded.toggle()
            }
        }
    }
}
110
Danny Behar @dbehar.com · 21/04/2025
The custom label style which takes in a isExpanded boolean and transitions with a matched geometry effect alongside an opacity and scale transition. You can customize this any way you want!
struct ExpandableLabelStyle: LabelStyle {
    @Namespace var namespace
    
    var isExpanded: Bool
    
    var transition: AnyTransition {
        .opacity.combined(with: .scale)
    }
    
    func makeBody(configuration: Configuration) -> some View {
        Group {
            if isExpanded {
                HStack {
                    configuration.icon
                        .matchedGeometryEffect(id: "expandableIcon", in: namespace)
                    configuration.title
                        
                }
                .transition(transition)
            } else {
                configuration.icon
                    .matchedGeometryEffect(id: "expandableIcon", in: namespace)
                    .transition(transition)
            }
        }
        .animation(.bouncy, value: isExpanded)
    }
}
110
Danny Behar @dbehar.com · 21/04/2025
Need to toggle between iconOnly and titleAndIcon label styles in SwiftUI? You can create your own custom LabelStyle and add some fun transition animations :D code below 👇
161
Danny Behar @dbehar.com · 20/04/2025
I like to make computed properties for these ternary state based values. In this case I believe using "any" makes SwiftUI's diffing algorithm slightly slower but its a useful tool in cases like this.
var labelStyle: any LabelStyle {
        isExpanded ? . titleAndIcon : .iconOnly
    }
110
Danny Behar @dbehar.com · 28/03/2025
Early look at the new loading indicator I'm working on for Tutti! Special thanks to @mikaelacaron.com for this brilliant idea and @matthewskiles.com for designing this wonderful SFSymbol asset.
250
Danny Behar @dbehar.com · 14/03/2025
Introducing Tutti’s beautiful new app icon! created by the one and only @matthewskiles.com The new icon is out now with the release of Tutti 2.4 apps.apple.com/us/app/paper...
181
Danny Behar @dbehar.com · 03/03/2025
I am SO excited to launch this in a few days. After lots of thought, and various design iterations... Here is a little sneak peak at Tutti's metronome! Built with #AudioKit and #SwiftUI
3174
Danny Behar @dbehar.com · 04/02/2025
The metronome in SFSymbols doesn't have a tick tock animation so I decided to build one myself! #BuildInPublic #iOS
0120
Danny Behar @dbehar.com · 15/12/2024
Finally, here is ViewModifier in action! Check the alt-text for the raw code below. When pasting into Xcode, make sure to BYOI 🌄 (Bring Your Own Image)
SwiftUI code showcasing the clipAndStroke view modifier in action

struct ClipAndStrokePreviewContainer: View {
    @State private var radius: CGFloat = 10
    @State private var lineWidth: CGFloat = 3
    
    var gradient: LinearGradient {
        LinearGradient(gradient: Gradient(colors: [.purple.opacity(0.3), .blue.opacity(0.3)]),
                       startPoint: .top,
                       endPoint: .bottom)
    }
    
    var body: some View {
        VStack {
            VStack {
                Image("pageOne")
                    .resizable()
                    .scaledToFit()
                    .frame(width: 225, height: 300)
                
                
            }
            .clipAndStroke(gradient, radius: radius, lineWidth: lineWidth)
            
            VStack(spacing: 8) {
                Slider(value: $radius, in: 0...20) {
                    Text("Radius").font(.title)
                } minimumValueLabel: {
                    Text("0")
                } maximumValueLabel: {
                    Text("20")
                }
                
                Text("Radius: \(radius, specifier: "%.0f")")
                    .foregroundStyle(Color.secondary)
            }
            
            VStack {
                Slider(value: $lineWidth, in: 0...20) {
                    Text("Line Width")
                } minimumValueLabel: {
                    Text("0")
                } maximumValueLabel: {
                    Text("20")
                }
                
                Text("Line Width: \(lineWidth, specifier: "%.0f")")
                    .foregroundStyle(Color.secondary)
            }
        }
        .padding(24)
        .border(Color.black, width: 2)
    }
}

#Preview {
    ClipAndStrokePreviewContainer()
        .padding()
}
110
Danny Behar @dbehar.com · 15/12/2024
And here is the CODE - (check the alt-text for the raw text) Included is a convenience function which defaults the clipped shape to a RoundedRectangle ▢
SwiftUI ViewModifier code for clipping an image or view to a shape with a stroked border

import SwiftUI

struct ClipAndStroke<S: Shape, C: ShapeStyle>: ViewModifier {
    var shape: S
    var styleContent: C
    var lineWidth: CGFloat
    
    func body(content: Content) -> some View {
        content
            .overlay(shape.stroke(styleContent, lineWidth: lineWidth))
            .clipShape(shape)
    }
}

extension View {
    func clipAndStroke<S: Shape, C: ShapeStyle>(shape: S, content: C, lineWidth: CGFloat) -> some View {
        modifier(ClipAndStroke(shape: shape, styleContent: content, lineWidth: lineWidth))
    }
    
    func clipAndStroke<C: ShapeStyle>(_ content: C, radius: CGFloat, lineWidth: CGFloat) -> some View {
        let shape = RoundedRectangle(cornerRadius: radius)
        return modifier(ClipAndStroke(shape: shape, styleContent: content, lineWidth: lineWidth))
    }
}
110
Danny Behar @dbehar.com · 15/12/2024
I keep needing to make a stroked border around Images in SwiftUI so I created a ViewModifier for it! Since it takes a Shape and ShapeStyle, you can style it with the shape and color / gradient of your choosing :D Check out the code below! 👇
140
Danny Behar @dbehar.com · 07/12/2024
But there is a problem... we need this static height value to scale based on the user's DynamicType preference! We can utilize the @ScaledMetric property wrapper for this! Set the relative Font.TextStyle to the the font you've defined in your view:
SwiftUI code snippet for an icon label with a dynamic height based on user's DynamicType preference:

struct CaptionLabel: View {
    @ScaledMetric(relativeTo: .caption)
    var height = 20.0
    
    var label: String
    var icon: String
    var color: Color
    var body: some View {
        HStack(spacing: Spacing.extraSmall) {
            Image(systemName: icon)
                .imageScale(.large)
            Text(label)
        }
         .frame(height: height)
         .padding(6)
        .background(color.opacity(0.12))
        .background(.thickMaterial)
        .clipShape(.rect(cornerRadius: 8))
        .font(.caption)
        .fontWeight(.bold)
        .foregroundStyle(color)
    }
}

#Preview {
    HStack {
        CaptionLabel(label: "4", icon: "bookmark", color: .blue)
        CaptionLabel(label: "3", icon: "bolt.horizontal", color: .orange)
    }
}
120
Danny Behar @dbehar.com · 07/12/2024
First, add a frame around the stack and specify either the width or height (depending on if you are laying your views out vertically or horizontally). Experiment with height value so that the taller icon has the smallest possible value without clipping the icon. Utilize SwiftUI Previews for this.
SwiftUI code snippet for an icon label with a constant height:

struct CaptionLabel: View {
    var height = 20.0
    
    var label: String
    var icon: String
    var color: Color
    var body: some View {
        HStack(spacing: Spacing.extraSmall) {
            Image(systemName: icon)
                .imageScale(.large)
            Text(label)
        }
         .frame(height: height)
         .padding(6)
        .background(color.opacity(0.12))
        .background(.thickMaterial)
        .clipShape(.rect(cornerRadius: 8))
        .font(.caption)
        .fontWeight(.bold)
        .foregroundStyle(color)
    }
}

#Preview {
    HStack {
        CaptionLabel(label: "4", icon: "bookmark", color: .blue)
        CaptionLabel(label: "3", icon: "bolt.horizontal", color: .orange)
    }
}
100
Danny Behar @dbehar.com · 07/12/2024
Does this look familiar? You are trying to create a consistent layout for multiple symbols that have noticeably different widths or heights. Here's how you can solve this problem in SwiftUI using the .frame modifier, font styles, and the @ScaledMetric property wrapper! 🧵 Before + After
3193
Danny Behar @dbehar.com · 05/12/2024
Reposting this on here cause I think it's super cool. This is something I worked on a couple months ago. It's a tuner built with SwiftUI and AudioKit. 🧵
150
Danny Behar @dbehar.com · 30/11/2024
Late submission to #RCGrowthChallenge with my app Tutti! apps.apple.com/us/app/sheet... I have a vision, deep domain (music) knowledge. Could absolutely benefit from the help in marketing expertise. Here is a demo of something I'm currently working on for the next version 😁
020
Danny Behar @dbehar.com · 29/11/2024
From there you can open the Package.swift file from the code editor of your choice and update the iOS version string under platforms. After updating, reopen Xcode and the error should go away. I hope this helps someone out there!
a view of the Package.swift file showing where to update the minimum iOS platform version under package, platforms
110
Danny Behar @dbehar.com · 29/11/2024
To update the minimum version and get rid of the above error, you need to edit the Package.swift file of the playground project which can be found by right clicking the .swiftpm project file in Finder and selecting "Show Package Contents"
a view of finder and the context menu when you right click on a .swiftpm file
120
Danny Behar @dbehar.com · 29/11/2024
I've been using App Playgrounds a lot more recently to prototype SwiftUI components. One problem I kept running into was that the app playground was being set with a default minimum target of iOS 16, with no obvious way of changing this within the Xcode GUI. 🧵
SwiftUI code showing a Picker trying to use the palette picker style but getting an Xcode error of: "'palette' is only available in iOS 17.0 or newer"
140
Danny Behar @dbehar.com · 18/11/2024
A relic of the past in Baltimore, MD. I wonder if it will still be here far into the future when hover cars roam the streets.
a phone booth on the sidewalk in Baltimore, MD. The phone booth is plastered with stickers. Angry face eyeball stickers and the phone wire is hanging without the ear piece.
010