├── fadingblur
├── fadingblur
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── sunset.imageset
│ │ │ ├── IMG_6155.jpg
│ │ │ ├── IMG_6155@2x.jpg
│ │ │ ├── IMG_6155@3x.jpg
│ │ │ └── Contents.json
│ │ ├── background.imageset
│ │ │ ├── BG 30-2.png
│ │ │ └── Contents.json
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Info.plist
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.storyboard
│ │ └── LaunchScreen.storyboard
│ ├── SceneDelegate.swift
│ ├── FadingEdgesView.swift
│ └── ViewController.swift
└── fadingblur.xcodeproj
│ ├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
│ └── project.pbxproj
├── README.md
└── .gitignore
/fadingblur/fadingblur/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Assets.xcassets/sunset.imageset/IMG_6155.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pavelshadrin/fadingblur/HEAD/fadingblur/fadingblur/Assets.xcassets/sunset.imageset/IMG_6155.jpg
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Assets.xcassets/background.imageset/BG 30-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pavelshadrin/fadingblur/HEAD/fadingblur/fadingblur/Assets.xcassets/background.imageset/BG 30-2.png
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Assets.xcassets/sunset.imageset/IMG_6155@2x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pavelshadrin/fadingblur/HEAD/fadingblur/fadingblur/Assets.xcassets/sunset.imageset/IMG_6155@2x.jpg
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Assets.xcassets/sunset.imageset/IMG_6155@3x.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pavelshadrin/fadingblur/HEAD/fadingblur/fadingblur/Assets.xcassets/sunset.imageset/IMG_6155@3x.jpg
--------------------------------------------------------------------------------
/fadingblur/fadingblur.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | }
8 | ],
9 | "info" : {
10 | "author" : "xcode",
11 | "version" : 1
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Assets.xcassets/background.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "BG 30-2.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Assets.xcassets/sunset.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "IMG_6155.jpg",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "IMG_6155@2x.jpg",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "IMG_6155@3x.jpg",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # fadingblur
2 |
3 | A demo project showing how the fading out effect can be achieved on a view with any kind of background (blurred, opaque, semi-transparent, multi-color or clear).
4 |
5 | Also providing a UIView subclass `FadingEdgesView` that can be used as a drop-in view class to fade its subviews. Edges to fade and insets (at which points fading actually kicks in) can be customized.
6 |
7 | 
8 |
9 | More details in my blog: https://pavelshadrin.hashnode.dev
10 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIApplicationSceneManifest
6 |
7 | UIApplicationSupportsMultipleScenes
8 |
9 | UISceneConfigurations
10 |
11 | UIWindowSceneSessionRoleApplication
12 |
13 |
14 | UISceneConfigurationName
15 | Default Configuration
16 | UISceneDelegateClassName
17 | $(PRODUCT_MODULE_NAME).SceneDelegate
18 | UISceneStoryboardFile
19 | Main
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // fadingblur
4 | //
5 | // Created by Pavel Shadrin on 29.09.2023.
6 | //
7 |
8 | import UIKit
9 |
10 | @main
11 | class AppDelegate: UIResponder, UIApplicationDelegate {
12 |
13 |
14 |
15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
16 | // Override point for customization after application launch.
17 | return true
18 | }
19 |
20 | // MARK: UISceneSession Lifecycle
21 |
22 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
23 | // Called when a new scene session is being created.
24 | // Use this method to select a configuration to create the new scene with.
25 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
26 | }
27 |
28 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
29 | // Called when the user discards a scene session.
30 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
31 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
32 | }
33 |
34 |
35 | }
36 |
37 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // fadingblur
4 | //
5 | // Created by Pavel Shadrin on 29.09.2023.
6 | //
7 |
8 | import UIKit
9 |
10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate {
11 |
12 | var window: UIWindow?
13 |
14 |
15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
16 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
17 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
18 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
19 | guard let _ = (scene as? UIWindowScene) else { return }
20 | }
21 |
22 | func sceneDidDisconnect(_ scene: UIScene) {
23 | // Called as the scene is being released by the system.
24 | // This occurs shortly after the scene enters the background, or when its session is discarded.
25 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
26 | // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
27 | }
28 |
29 | func sceneDidBecomeActive(_ scene: UIScene) {
30 | // Called when the scene has moved from an inactive state to an active state.
31 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
32 | }
33 |
34 | func sceneWillResignActive(_ scene: UIScene) {
35 | // Called when the scene will move from an active state to an inactive state.
36 | // This may occur due to temporary interruptions (ex. an incoming phone call).
37 | }
38 |
39 | func sceneWillEnterForeground(_ scene: UIScene) {
40 | // Called as the scene transitions from the background to the foreground.
41 | // Use this method to undo the changes made on entering the background.
42 | }
43 |
44 | func sceneDidEnterBackground(_ scene: UIScene) {
45 | // Called as the scene transitions from the foreground to the background.
46 | // Use this method to save data, release shared resources, and store enough scene-specific state information
47 | // to restore the scene back to its current state.
48 | }
49 |
50 |
51 | }
52 |
53 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## User settings
6 | xcuserdata/
7 |
8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
9 | *.xcscmblueprint
10 | *.xccheckout
11 |
12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
13 | build/
14 | DerivedData/
15 | *.moved-aside
16 | *.pbxuser
17 | !default.pbxuser
18 | *.mode1v3
19 | !default.mode1v3
20 | *.mode2v3
21 | !default.mode2v3
22 | *.perspectivev3
23 | !default.perspectivev3
24 |
25 | ## Obj-C/Swift specific
26 | *.hmap
27 |
28 | ## App packaging
29 | *.ipa
30 | *.dSYM.zip
31 | *.dSYM
32 |
33 | ## Playgrounds
34 | timeline.xctimeline
35 | playground.xcworkspace
36 |
37 | # Swift Package Manager
38 | #
39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
40 | # Packages/
41 | # Package.pins
42 | # Package.resolved
43 | # *.xcodeproj
44 | #
45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
46 | # hence it is not needed unless you have added a package configuration file to your project
47 | # .swiftpm
48 |
49 | .build/
50 |
51 | # CocoaPods
52 | #
53 | # We recommend against adding the Pods directory to your .gitignore. However
54 | # you should judge for yourself, the pros and cons are mentioned at:
55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
56 | #
57 | # Pods/
58 | #
59 | # Add this line if you want to avoid checking in source code from the Xcode workspace
60 | # *.xcworkspace
61 |
62 | # Carthage
63 | #
64 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
65 | # Carthage/Checkouts
66 |
67 | Carthage/Build/
68 |
69 | # Accio dependency management
70 | Dependencies/
71 | .accio/
72 |
73 | # fastlane
74 | #
75 | # It is recommended to not store the screenshots in the git repo.
76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed.
77 | # For more information about the recommended setup visit:
78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
79 |
80 | fastlane/report.xml
81 | fastlane/Preview.html
82 | fastlane/screenshots/**/*.png
83 | fastlane/test_output
84 |
85 | # Code Injection
86 | #
87 | # After new code Injection tools there's a generated folder /iOSInjectionProject
88 | # https://github.com/johnno1962/injectionforxcode
89 |
90 | iOSInjectionProject/
91 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/FadingEdgesView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // File.swift
3 | // fadingblur
4 | //
5 | // Created by Pavel Shadrin on 01.10.2023.
6 | //
7 |
8 | import UIKit
9 |
10 | class FadingEdgesView: UIView {
11 | enum FadingEdges {
12 | case vertical(top: Double, bottom: Double)
13 | case horizontal(left: Double, right: Double)
14 | }
15 |
16 | private let edges: FadingEdges
17 |
18 | private lazy var contentView: UIView = {
19 | let view = UIView(frame: .zero)
20 | view.translatesAutoresizingMaskIntoConstraints = false
21 | view.backgroundColor = .clear
22 |
23 | return view
24 | }()
25 |
26 | private lazy var gradientMask: CAGradientLayer = {
27 | let gradientLayer = CAGradientLayer()
28 |
29 | gradientLayer.colors = [UIColor.clear.cgColor, UIColor.white.cgColor, UIColor.white.cgColor, UIColor.clear.cgColor]
30 | switch self.edges {
31 | case .vertical(let top, let bottom):
32 | gradientLayer.locations = [0.0, top as NSNumber, bottom as NSNumber, 1.0]
33 | gradientLayer.startPoint = CGPoint(x: 0.5, y: 0)
34 | gradientLayer.endPoint = CGPoint(x: 0.5, y: 1)
35 | case .horizontal(let left, let right):
36 | gradientLayer.locations = [0.0, left as NSNumber, right as NSNumber, 1.0]
37 | gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
38 | gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
39 | }
40 |
41 | return gradientLayer
42 | }()
43 |
44 | init(edges: FadingEdges) {
45 | self.edges = edges
46 |
47 | super.init(frame: .zero)
48 | self.translatesAutoresizingMaskIntoConstraints = false
49 |
50 | addSubview(contentView)
51 |
52 | contentView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
53 | contentView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
54 | contentView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
55 | contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
56 | }
57 |
58 | required init?(coder: NSCoder) {
59 | fatalError("init(coder:) has not been implemented")
60 | }
61 |
62 | override func layoutSubviews() {
63 | super.layoutSubviews()
64 |
65 | gradientMask.frame = contentView.bounds
66 | contentView.layer.mask = gradientMask
67 |
68 | bringSubviewToFront(contentView)
69 | }
70 |
71 | private var subviewToFade: UIView?
72 | func addSubviewToFade(_ subview: UIView) {
73 | subviewToFade?.removeFromSuperview()
74 | contentView.addSubview(subview)
75 | subviewToFade = subview
76 |
77 | subviewToFade?.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
78 | subviewToFade?.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
79 | subviewToFade?.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
80 | subviewToFade?.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
81 |
82 | setNeedsLayout()
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // fadingblur
4 | //
5 | // Created by Pavel Shadrin on 29.09.2023.
6 | //
7 |
8 | import UIKit
9 |
10 | class ViewController: UIViewController {
11 |
12 | // MARK: - Views
13 |
14 | private let backgroundImageView: UIImageView = {
15 | let view = UIImageView(image: UIImage(named: "sunset"))
16 |
17 | view.contentMode = .scaleAspectFill
18 | view.translatesAutoresizingMaskIntoConstraints = false
19 |
20 | return view
21 | }()
22 |
23 | private let mainStackView: UIStackView = {
24 | let mainStackView = UIStackView(frame: .zero)
25 |
26 | mainStackView.translatesAutoresizingMaskIntoConstraints = false
27 | mainStackView.axis = .vertical
28 | mainStackView.distribution = .fillEqually
29 | mainStackView.alignment = .fill
30 | mainStackView.spacing = 0.0
31 | mainStackView.backgroundColor = .clear
32 |
33 | return mainStackView
34 | }()
35 |
36 | private let opaqueOneColorView: FadingEdgesView = {
37 | let view = FadingEdgesView(edges: .horizontal(left: 0.3, right: 0.7))
38 | view.backgroundColor = .gray
39 | return view
40 | }()
41 |
42 | private let semiTransparentOneColorView: FadingEdgesView = {
43 | let view = FadingEdgesView(edges: .horizontal(left: 0.3, right: 0.7))
44 | view.backgroundColor = .gray.withAlphaComponent(0.4)
45 | return view
46 | }()
47 |
48 | private let blurredView: FadingEdgesView = {
49 | let view = FadingEdgesView(edges: .horizontal(left: 0.3, right: 0.7))
50 |
51 | view.backgroundColor = .clear
52 |
53 | let blurEffect = UIBlurEffect(style: .dark)
54 | let blurView = UIVisualEffectView(effect: blurEffect)
55 | blurView.translatesAutoresizingMaskIntoConstraints = false
56 |
57 | view.insertSubview(blurView, at: 0)
58 |
59 | blurView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
60 | blurView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
61 | blurView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
62 | blurView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
63 |
64 | return view
65 | }()
66 |
67 | private let multiColorView: FadingEdgesView = {
68 | let view = FadingEdgesView(edges: .horizontal(left: 0.3, right: 0.7))
69 | if let image = UIImage(named: "background.png") {
70 | view.backgroundColor = UIColor(patternImage: image)
71 | }
72 |
73 | return view
74 | }()
75 |
76 | private let clearView: FadingEdgesView = {
77 | let view = FadingEdgesView(edges: .horizontal(left: 0.3, right: 0.7))
78 | view.backgroundColor = .clear
79 | return view
80 | }()
81 |
82 | private func makeScrollableDemoView() -> UIView {
83 | let scrollView = UIScrollView(frame: .zero)
84 | scrollView.translatesAutoresizingMaskIntoConstraints = false
85 |
86 | let stackView = UIStackView()
87 | scrollView.addSubview(stackView)
88 |
89 | stackView.spacing = 40
90 | stackView.isLayoutMarginsRelativeArrangement = true
91 | stackView.directionalLayoutMargins = NSDirectionalEdgeInsets(top: 20, leading: 20, bottom: 20, trailing: 20)
92 | stackView.axis = .horizontal
93 | stackView.alignment = .center
94 | stackView.distribution = .fill
95 | stackView.backgroundColor = .clear
96 | stackView.translatesAutoresizingMaskIntoConstraints = false
97 |
98 | for string in ["This", "is", "a", "test", "scrollable", "view"] {
99 | let label = UILabel(frame: .zero)
100 | label.font = .systemFont(ofSize: 24, weight: .bold)
101 | label.text = string
102 | stackView.addArrangedSubview(label)
103 | }
104 |
105 | stackView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
106 | stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
107 | stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
108 | stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
109 |
110 | stackView.heightAnchor.constraint(equalTo: scrollView.heightAnchor).isActive = true
111 |
112 | return scrollView
113 | }
114 |
115 | // MARK: - Life Cycle
116 |
117 | override func viewDidLoad() {
118 | super.viewDidLoad()
119 |
120 | view.addSubview(backgroundImageView)
121 | backgroundImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
122 | backgroundImageView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
123 | backgroundImageView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
124 | backgroundImageView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
125 |
126 | view.addSubview(mainStackView)
127 | mainStackView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
128 | mainStackView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
129 | mainStackView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
130 | mainStackView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
131 |
132 | mainStackView.addArrangedSubview(opaqueOneColorView)
133 | mainStackView.addArrangedSubview(semiTransparentOneColorView)
134 | mainStackView.addArrangedSubview(blurredView)
135 | mainStackView.addArrangedSubview(multiColorView)
136 | mainStackView.addArrangedSubview(clearView)
137 |
138 | mainStackView.arrangedSubviews.forEach { view in
139 | if let fadingView = view as? FadingEdgesView {
140 | let demoView = makeScrollableDemoView()
141 | fadingView.addSubviewToFade(demoView)
142 | }
143 | }
144 | }
145 | }
146 |
147 |
--------------------------------------------------------------------------------
/fadingblur/fadingblur.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | AB300A162AC7892B00B82CFF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB300A152AC7892B00B82CFF /* AppDelegate.swift */; };
11 | AB300A182AC7892B00B82CFF /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB300A172AC7892B00B82CFF /* SceneDelegate.swift */; };
12 | AB300A1A2AC7892B00B82CFF /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB300A192AC7892B00B82CFF /* ViewController.swift */; };
13 | AB300A1D2AC7892B00B82CFF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB300A1B2AC7892B00B82CFF /* Main.storyboard */; };
14 | AB300A1F2AC7892D00B82CFF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AB300A1E2AC7892D00B82CFF /* Assets.xcassets */; };
15 | AB300A222AC7892D00B82CFF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB300A202AC7892D00B82CFF /* LaunchScreen.storyboard */; };
16 | AB300A2A2AC8F99600B82CFF /* FadingEdgesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB300A292AC8F99500B82CFF /* FadingEdgesView.swift */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXFileReference section */
20 | AB300A122AC7892B00B82CFF /* fadingblur.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = fadingblur.app; sourceTree = BUILT_PRODUCTS_DIR; };
21 | AB300A152AC7892B00B82CFF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
22 | AB300A172AC7892B00B82CFF /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
23 | AB300A192AC7892B00B82CFF /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
24 | AB300A1C2AC7892B00B82CFF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
25 | AB300A1E2AC7892D00B82CFF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
26 | AB300A212AC7892D00B82CFF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
27 | AB300A232AC7892D00B82CFF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
28 | AB300A292AC8F99500B82CFF /* FadingEdgesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FadingEdgesView.swift; sourceTree = ""; };
29 | /* End PBXFileReference section */
30 |
31 | /* Begin PBXFrameworksBuildPhase section */
32 | AB300A0F2AC7892B00B82CFF /* Frameworks */ = {
33 | isa = PBXFrameworksBuildPhase;
34 | buildActionMask = 2147483647;
35 | files = (
36 | );
37 | runOnlyForDeploymentPostprocessing = 0;
38 | };
39 | /* End PBXFrameworksBuildPhase section */
40 |
41 | /* Begin PBXGroup section */
42 | AB300A092AC7892B00B82CFF = {
43 | isa = PBXGroup;
44 | children = (
45 | AB300A142AC7892B00B82CFF /* fadingblur */,
46 | AB300A132AC7892B00B82CFF /* Products */,
47 | );
48 | sourceTree = "";
49 | };
50 | AB300A132AC7892B00B82CFF /* Products */ = {
51 | isa = PBXGroup;
52 | children = (
53 | AB300A122AC7892B00B82CFF /* fadingblur.app */,
54 | );
55 | name = Products;
56 | sourceTree = "";
57 | };
58 | AB300A142AC7892B00B82CFF /* fadingblur */ = {
59 | isa = PBXGroup;
60 | children = (
61 | AB300A152AC7892B00B82CFF /* AppDelegate.swift */,
62 | AB300A172AC7892B00B82CFF /* SceneDelegate.swift */,
63 | AB300A292AC8F99500B82CFF /* FadingEdgesView.swift */,
64 | AB300A192AC7892B00B82CFF /* ViewController.swift */,
65 | AB300A1B2AC7892B00B82CFF /* Main.storyboard */,
66 | AB300A1E2AC7892D00B82CFF /* Assets.xcassets */,
67 | AB300A202AC7892D00B82CFF /* LaunchScreen.storyboard */,
68 | AB300A232AC7892D00B82CFF /* Info.plist */,
69 | );
70 | path = fadingblur;
71 | sourceTree = "";
72 | };
73 | /* End PBXGroup section */
74 |
75 | /* Begin PBXNativeTarget section */
76 | AB300A112AC7892B00B82CFF /* fadingblur */ = {
77 | isa = PBXNativeTarget;
78 | buildConfigurationList = AB300A262AC7892D00B82CFF /* Build configuration list for PBXNativeTarget "fadingblur" */;
79 | buildPhases = (
80 | AB300A0E2AC7892B00B82CFF /* Sources */,
81 | AB300A0F2AC7892B00B82CFF /* Frameworks */,
82 | AB300A102AC7892B00B82CFF /* Resources */,
83 | );
84 | buildRules = (
85 | );
86 | dependencies = (
87 | );
88 | name = fadingblur;
89 | productName = fadingblur;
90 | productReference = AB300A122AC7892B00B82CFF /* fadingblur.app */;
91 | productType = "com.apple.product-type.application";
92 | };
93 | /* End PBXNativeTarget section */
94 |
95 | /* Begin PBXProject section */
96 | AB300A0A2AC7892B00B82CFF /* Project object */ = {
97 | isa = PBXProject;
98 | attributes = {
99 | BuildIndependentTargetsInParallel = 1;
100 | LastSwiftUpdateCheck = 1500;
101 | LastUpgradeCheck = 1500;
102 | TargetAttributes = {
103 | AB300A112AC7892B00B82CFF = {
104 | CreatedOnToolsVersion = 15.0;
105 | };
106 | };
107 | };
108 | buildConfigurationList = AB300A0D2AC7892B00B82CFF /* Build configuration list for PBXProject "fadingblur" */;
109 | compatibilityVersion = "Xcode 14.0";
110 | developmentRegion = en;
111 | hasScannedForEncodings = 0;
112 | knownRegions = (
113 | en,
114 | Base,
115 | );
116 | mainGroup = AB300A092AC7892B00B82CFF;
117 | productRefGroup = AB300A132AC7892B00B82CFF /* Products */;
118 | projectDirPath = "";
119 | projectRoot = "";
120 | targets = (
121 | AB300A112AC7892B00B82CFF /* fadingblur */,
122 | );
123 | };
124 | /* End PBXProject section */
125 |
126 | /* Begin PBXResourcesBuildPhase section */
127 | AB300A102AC7892B00B82CFF /* Resources */ = {
128 | isa = PBXResourcesBuildPhase;
129 | buildActionMask = 2147483647;
130 | files = (
131 | AB300A222AC7892D00B82CFF /* LaunchScreen.storyboard in Resources */,
132 | AB300A1F2AC7892D00B82CFF /* Assets.xcassets in Resources */,
133 | AB300A1D2AC7892B00B82CFF /* Main.storyboard in Resources */,
134 | );
135 | runOnlyForDeploymentPostprocessing = 0;
136 | };
137 | /* End PBXResourcesBuildPhase section */
138 |
139 | /* Begin PBXSourcesBuildPhase section */
140 | AB300A0E2AC7892B00B82CFF /* Sources */ = {
141 | isa = PBXSourcesBuildPhase;
142 | buildActionMask = 2147483647;
143 | files = (
144 | AB300A1A2AC7892B00B82CFF /* ViewController.swift in Sources */,
145 | AB300A2A2AC8F99600B82CFF /* FadingEdgesView.swift in Sources */,
146 | AB300A162AC7892B00B82CFF /* AppDelegate.swift in Sources */,
147 | AB300A182AC7892B00B82CFF /* SceneDelegate.swift in Sources */,
148 | );
149 | runOnlyForDeploymentPostprocessing = 0;
150 | };
151 | /* End PBXSourcesBuildPhase section */
152 |
153 | /* Begin PBXVariantGroup section */
154 | AB300A1B2AC7892B00B82CFF /* Main.storyboard */ = {
155 | isa = PBXVariantGroup;
156 | children = (
157 | AB300A1C2AC7892B00B82CFF /* Base */,
158 | );
159 | name = Main.storyboard;
160 | sourceTree = "";
161 | };
162 | AB300A202AC7892D00B82CFF /* LaunchScreen.storyboard */ = {
163 | isa = PBXVariantGroup;
164 | children = (
165 | AB300A212AC7892D00B82CFF /* Base */,
166 | );
167 | name = LaunchScreen.storyboard;
168 | sourceTree = "";
169 | };
170 | /* End PBXVariantGroup section */
171 |
172 | /* Begin XCBuildConfiguration section */
173 | AB300A242AC7892D00B82CFF /* Debug */ = {
174 | isa = XCBuildConfiguration;
175 | buildSettings = {
176 | ALWAYS_SEARCH_USER_PATHS = NO;
177 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
178 | CLANG_ANALYZER_NONNULL = YES;
179 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
180 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
181 | CLANG_ENABLE_MODULES = YES;
182 | CLANG_ENABLE_OBJC_ARC = YES;
183 | CLANG_ENABLE_OBJC_WEAK = YES;
184 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
185 | CLANG_WARN_BOOL_CONVERSION = YES;
186 | CLANG_WARN_COMMA = YES;
187 | CLANG_WARN_CONSTANT_CONVERSION = YES;
188 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
189 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
190 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
191 | CLANG_WARN_EMPTY_BODY = YES;
192 | CLANG_WARN_ENUM_CONVERSION = YES;
193 | CLANG_WARN_INFINITE_RECURSION = YES;
194 | CLANG_WARN_INT_CONVERSION = YES;
195 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
196 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
197 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
198 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
199 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
200 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
201 | CLANG_WARN_STRICT_PROTOTYPES = YES;
202 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
203 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
204 | CLANG_WARN_UNREACHABLE_CODE = YES;
205 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
206 | COPY_PHASE_STRIP = NO;
207 | DEBUG_INFORMATION_FORMAT = dwarf;
208 | ENABLE_STRICT_OBJC_MSGSEND = YES;
209 | ENABLE_TESTABILITY = YES;
210 | ENABLE_USER_SCRIPT_SANDBOXING = YES;
211 | GCC_C_LANGUAGE_STANDARD = gnu17;
212 | GCC_DYNAMIC_NO_PIC = NO;
213 | GCC_NO_COMMON_BLOCKS = YES;
214 | GCC_OPTIMIZATION_LEVEL = 0;
215 | GCC_PREPROCESSOR_DEFINITIONS = (
216 | "DEBUG=1",
217 | "$(inherited)",
218 | );
219 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
220 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
221 | GCC_WARN_UNDECLARED_SELECTOR = YES;
222 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
223 | GCC_WARN_UNUSED_FUNCTION = YES;
224 | GCC_WARN_UNUSED_VARIABLE = YES;
225 | IPHONEOS_DEPLOYMENT_TARGET = 17.0;
226 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
227 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
228 | MTL_FAST_MATH = YES;
229 | ONLY_ACTIVE_ARCH = YES;
230 | SDKROOT = iphoneos;
231 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
232 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
233 | };
234 | name = Debug;
235 | };
236 | AB300A252AC7892D00B82CFF /* Release */ = {
237 | isa = XCBuildConfiguration;
238 | buildSettings = {
239 | ALWAYS_SEARCH_USER_PATHS = NO;
240 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
241 | CLANG_ANALYZER_NONNULL = YES;
242 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
243 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
244 | CLANG_ENABLE_MODULES = YES;
245 | CLANG_ENABLE_OBJC_ARC = YES;
246 | CLANG_ENABLE_OBJC_WEAK = YES;
247 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
248 | CLANG_WARN_BOOL_CONVERSION = YES;
249 | CLANG_WARN_COMMA = YES;
250 | CLANG_WARN_CONSTANT_CONVERSION = YES;
251 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
252 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
253 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
254 | CLANG_WARN_EMPTY_BODY = YES;
255 | CLANG_WARN_ENUM_CONVERSION = YES;
256 | CLANG_WARN_INFINITE_RECURSION = YES;
257 | CLANG_WARN_INT_CONVERSION = YES;
258 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
259 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
260 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
261 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
262 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
263 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
264 | CLANG_WARN_STRICT_PROTOTYPES = YES;
265 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
266 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
267 | CLANG_WARN_UNREACHABLE_CODE = YES;
268 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
269 | COPY_PHASE_STRIP = NO;
270 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
271 | ENABLE_NS_ASSERTIONS = NO;
272 | ENABLE_STRICT_OBJC_MSGSEND = YES;
273 | ENABLE_USER_SCRIPT_SANDBOXING = YES;
274 | GCC_C_LANGUAGE_STANDARD = gnu17;
275 | GCC_NO_COMMON_BLOCKS = YES;
276 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
277 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
278 | GCC_WARN_UNDECLARED_SELECTOR = YES;
279 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
280 | GCC_WARN_UNUSED_FUNCTION = YES;
281 | GCC_WARN_UNUSED_VARIABLE = YES;
282 | IPHONEOS_DEPLOYMENT_TARGET = 17.0;
283 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
284 | MTL_ENABLE_DEBUG_INFO = NO;
285 | MTL_FAST_MATH = YES;
286 | SDKROOT = iphoneos;
287 | SWIFT_COMPILATION_MODE = wholemodule;
288 | VALIDATE_PRODUCT = YES;
289 | };
290 | name = Release;
291 | };
292 | AB300A272AC7892D00B82CFF /* Debug */ = {
293 | isa = XCBuildConfiguration;
294 | buildSettings = {
295 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
296 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
297 | CODE_SIGN_STYLE = Automatic;
298 | CURRENT_PROJECT_VERSION = 1;
299 | DEVELOPMENT_TEAM = 6J4YR7Q3K8;
300 | GENERATE_INFOPLIST_FILE = YES;
301 | INFOPLIST_FILE = fadingblur/Info.plist;
302 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
303 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
304 | INFOPLIST_KEY_UIMainStoryboardFile = Main;
305 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
306 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
307 | LD_RUNPATH_SEARCH_PATHS = (
308 | "$(inherited)",
309 | "@executable_path/Frameworks",
310 | );
311 | MARKETING_VERSION = 1.0;
312 | PRODUCT_BUNDLE_IDENTIFIER = ru.pavelshadrin.fadingblur;
313 | PRODUCT_NAME = "$(TARGET_NAME)";
314 | SWIFT_EMIT_LOC_STRINGS = YES;
315 | SWIFT_VERSION = 5.0;
316 | TARGETED_DEVICE_FAMILY = "1,2";
317 | };
318 | name = Debug;
319 | };
320 | AB300A282AC7892D00B82CFF /* Release */ = {
321 | isa = XCBuildConfiguration;
322 | buildSettings = {
323 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
324 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
325 | CODE_SIGN_STYLE = Automatic;
326 | CURRENT_PROJECT_VERSION = 1;
327 | DEVELOPMENT_TEAM = 6J4YR7Q3K8;
328 | GENERATE_INFOPLIST_FILE = YES;
329 | INFOPLIST_FILE = fadingblur/Info.plist;
330 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
331 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
332 | INFOPLIST_KEY_UIMainStoryboardFile = Main;
333 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
334 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
335 | LD_RUNPATH_SEARCH_PATHS = (
336 | "$(inherited)",
337 | "@executable_path/Frameworks",
338 | );
339 | MARKETING_VERSION = 1.0;
340 | PRODUCT_BUNDLE_IDENTIFIER = ru.pavelshadrin.fadingblur;
341 | PRODUCT_NAME = "$(TARGET_NAME)";
342 | SWIFT_EMIT_LOC_STRINGS = YES;
343 | SWIFT_VERSION = 5.0;
344 | TARGETED_DEVICE_FAMILY = "1,2";
345 | };
346 | name = Release;
347 | };
348 | /* End XCBuildConfiguration section */
349 |
350 | /* Begin XCConfigurationList section */
351 | AB300A0D2AC7892B00B82CFF /* Build configuration list for PBXProject "fadingblur" */ = {
352 | isa = XCConfigurationList;
353 | buildConfigurations = (
354 | AB300A242AC7892D00B82CFF /* Debug */,
355 | AB300A252AC7892D00B82CFF /* Release */,
356 | );
357 | defaultConfigurationIsVisible = 0;
358 | defaultConfigurationName = Release;
359 | };
360 | AB300A262AC7892D00B82CFF /* Build configuration list for PBXNativeTarget "fadingblur" */ = {
361 | isa = XCConfigurationList;
362 | buildConfigurations = (
363 | AB300A272AC7892D00B82CFF /* Debug */,
364 | AB300A282AC7892D00B82CFF /* Release */,
365 | );
366 | defaultConfigurationIsVisible = 0;
367 | defaultConfigurationName = Release;
368 | };
369 | /* End XCConfigurationList section */
370 | };
371 | rootObject = AB300A0A2AC7892B00B82CFF /* Project object */;
372 | }
373 |
--------------------------------------------------------------------------------