9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

お題は不問!Qiita Engineer Festa 2023で記事投稿!

【SwiftUI】Macの天気アプリのUIを再現する

Last updated at Posted at 2023-07-20

はじめに

Macの天気アプリはMacアプリの中でも一際目立ったデザインをしています。
特に、サイドバーとタイトルバーが色鮮やかなのは他の純正アプリには見られない珍しい特徴です。
今回は、このUIの再現に挑戦します。

スクリーンショット 2023-07-20 16.00.45.png

サイドバーに色を塗る

まず、サイドバーの背景色を設定します。
サイドバーは、NavigationSplitViewの第一引数にListを設置して表現します。
.scrollContentBackground(.hidden)Listの標準の背景をなくし、
.background(Color.blue.gradient)で青のグラデーションを背景にします。

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationSplitView {
            List {
                Text("Item1")
                Text("Item2")
                Text("Item3")
            }
            .foregroundColor(.white) // 見やすくするため文字色を白にする
            .scrollContentBackground(.hidden)
            .background(Color.blue.gradient)
        } detail: {
            
        }
    }
}

スクリーンショット 2023-07-20 17.11.55.png

これだけでも、かなり近づきました。

タイトルバーを脱色する

次に、タイトルバーの背景を透明にし、背景色を設定します。
.toolbarBackground(Color.clear, for: .windowToolbar)をつけてタイトルバーの背景色をなくし、青のグラデーションに.ignoresSafeArea()をつけてタイトルバーまで広げます。

struct ContentView: View {
    var body: some View {
        NavigationSplitView {
            List {
                Text("Item1")
                Text("Item2")
                Text("Item3")
            }
            .foregroundColor(.white)
            .scrollContentBackground(.hidden)
            .background(Color.blue.gradient)
        } detail: {
            ZStack {
                // 青のグラデーション
                Rectangle()
                    .fill(Color.blue.gradient)
                    .ignoresSafeArea()
            }
            .navigationTitle("") // タイトルをなくす
        }
        .toolbarBackground(Color.clear, for: .windowToolbar)
    }
}

スクリーンショット 2023-07-20 17.25.35.png

これで90%の仕上がりになりました。

完成

最後に、デザインを整えて完成です。

サイドバー横の線を黒くするために、NavigationSplitView.environment(\.colorScheme, .dark)をつけます。

そして、NavigationSplitView内の二つのViewのカラースキームを@Environment(\.colorScheme) var colorSchemeで取得したデバイスのカラースキームに戻します。

struct ContentView: View {
    @Environment(\.colorScheme) var colorScheme // New!

    var body: some View {
        NavigationSplitView {
            List {
                Text("Item1")
                Text("Item2")
                Text("Item3")
            }
            .foregroundColor(.white)
            .scrollContentBackground(.hidden)
            .background(Color.blue.gradient)
            .environment(\.colorScheme, colorScheme) // New!
        } detail: {
            ZStack {
                Rectangle()
                    .fill(Color.blue.gradient)
                    .ignoresSafeArea()
            }
            .navigationTitle("")
            .environment(\.colorScheme, colorScheme) // New!
        }
        .toolbarBackground(Color.clear, for: .windowToolbar)
        .environment(\.colorScheme, .dark) // New!
    }
}

スクリーンショット 2023-07-20 17.33.20.png

これで、Macの天気アプリのような美しいウィンドウが完成しました!

おまけ

.toolbarBackground(Color.red, for: .windowToolbar)のように色を設定すると、
このようにパワポ風のウィンドウを作れます。
スクリーンショット 2023-07-20 17.37.36.png

おわりに

サイドバーやタイトルバーの色を変えると、アプリの印象がガラリと変わりますね。この記事が参考になったという方は、いいねとフォローお願いします☺️

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?