Browse Source

base code commit from windows system

master
Sriram K 3 years ago
commit
3470c7e360
  1. 128
      CODE_OF_CONDUCT.md
  2. 28
      CONTRIBUTING.md
  3. 82
      Examples.xcworkspace/contents.xcworkspacedata
  4. 8
      Examples.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  5. 122
      Files/AnimatableCards.swift
  6. 79
      Files/AreaToCard.swift
  7. 21
      LICENSE
  8. 0
      Other Projects/2048 Game/LICENSE
  9. 0
      Other Projects/2048 Game/Screenshot.png
  10. 407
      Other Projects/2048 Game/SwiftUI2048.xcodeproj/project.pbxproj
  11. 7
      Other Projects/2048 Game/SwiftUI2048.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  12. 8
      Other Projects/2048 Game/SwiftUI2048.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  13. 58
      Other Projects/2048 Game/SwiftUI2048/AppDelegate.swift
  14. 98
      Other Projects/2048 Game/SwiftUI2048/Assets.xcassets/AppIcon.appiconset/Contents.json
  15. 6
      Other Projects/2048 Game/SwiftUI2048/Assets.xcassets/Contents.json
  16. 26
      Other Projects/2048 Game/SwiftUI2048/Base.lproj/LaunchScreen.storyboard
  17. 13
      Other Projects/2048 Game/SwiftUI2048/FunctionalUtils.swift
  18. 45
      Other Projects/2048 Game/SwiftUI2048/Info.plist
  19. 20
      Other Projects/2048 Game/SwiftUI2048/MainMenu.xib
  20. 127
      Other Projects/2048 Game/SwiftUI2048/Models/BlockMatrix.swift
  21. 176
      Other Projects/2048 Game/SwiftUI2048/Models/GameLogic.swift
  22. 16
      Other Projects/2048 Game/SwiftUI2048/Models/IdentifiedBlock.swift
  23. 6
      Other Projects/2048 Game/SwiftUI2048/Preview Content/Preview Assets.xcassets/Contents.json
  24. 10
      Other Projects/2048 Game/SwiftUI2048/SwiftUI2048.entitlements
  25. 116
      Other Projects/2048 Game/SwiftUI2048/Views/BlockGridView.swift
  26. 118
      Other Projects/2048 Game/SwiftUI2048/Views/BlockView.swift
  27. 127
      Other Projects/2048 Game/SwiftUI2048/Views/GameView.swift
  28. 21
      Other Projects/Animating Views And Transitions/Complete/.gitignore
  29. 13
      Other Projects/Animating Views And Transitions/Complete/Configuration/SampleCode.xcconfig
  30. 8
      Other Projects/Animating Views And Transitions/Complete/LICENSE/LICENSE.txt
  31. 5
      Other Projects/Animating Views And Transitions/Complete/Landmarks/AnimatingViewsAndTransitions.xcodeproj/.xcodesamplecode.plist
  32. 525
      Other Projects/Animating Views And Transitions/Complete/Landmarks/AnimatingViewsAndTransitions.xcodeproj/project.pbxproj
  33. 8
      Other Projects/Animating Views And Transitions/Complete/Landmarks/AnimatingViewsAndTransitions.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  34. 36
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/AppDelegate.swift
  35. 113
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/Contents.json
  36. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_1024x1024.png
  37. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_120x120-1.png
  38. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_120x120.png
  39. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_152x152.png
  40. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_167x167.png
  41. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_180x180.png
  42. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_40x40-1.png
  43. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_40x40-2.png
  44. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_40x40.png
  45. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_58x58-1.png
  46. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_58x58.png
  47. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_76x76.png
  48. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_80x80-1.png
  49. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_80x80.png
  50. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_87x87.png
  51. 6
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/Contents.json
  52. 21
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/turtlerock.imageset/Contents.json
  53. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/turtlerock.imageset/turtlerock.jpg
  54. 25
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Base.lproj/LaunchScreen.storyboard
  55. 57
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/HexagonParameters.swift
  56. 49
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/HikeDetail.swift
  57. 68
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/HikeView.swift
  58. 62
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Info.plist
  59. 71
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/LandmarkDetail.swift
  60. 46
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/LandmarkList.swift
  61. 95
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Models/Data.swift
  62. 31
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Models/Hike.swift
  63. 42
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Models/Landmark.swift
  64. 15
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Models/UserData.swift
  65. 6
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Preview Content/Preview Assets.xcassets/Contents.json
  66. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/charleyrivers.jpg
  67. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/chilkoottrail.jpg
  68. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/chincoteague.jpg
  69. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/hiddenlake.jpg
  70. 1882
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/hikeData.json
  71. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/icybay.jpg
  72. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/lakemcdonald.jpg
  73. 182
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/landmarkData.json
  74. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/rainbowlake.jpg
  75. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/silversalmoncreek.jpg
  76. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/stmarylake.jpg
  77. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/turtlerock.jpg
  78. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/twinlake.jpg
  79. BIN
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/umbagog.jpg
  80. 58
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/SceneDelegate.swift
  81. 41
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/Badge.swift
  82. 64
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/BadgeBackground.swift
  83. 51
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/BadgeSymbol.swift
  84. 27
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/CircleImage.swift
  85. 45
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/GraphCapsule.swift
  86. 74
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/HikeGraph.swift
  87. 38
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/LandmarkRow.swift
  88. 31
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/MapView.swift
  89. 26
      Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/RotatedBadgeSymbol.swift
  90. 3
      Other Projects/Animating Views And Transitions/Complete/README.md
  91. 21
      Other Projects/Animating Views And Transitions/StartingPoint/.gitignore
  92. 13
      Other Projects/Animating Views And Transitions/StartingPoint/Configuration/SampleCode.xcconfig
  93. 8
      Other Projects/Animating Views And Transitions/StartingPoint/LICENSE/LICENSE.txt
  94. 5
      Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/AnimatingViewsAndTransitions.xcodeproj/.xcodesamplecode.plist
  95. 525
      Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/AnimatingViewsAndTransitions.xcodeproj/project.pbxproj
  96. 8
      Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/AnimatingViewsAndTransitions.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  97. 36
      Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/Landmarks/AppDelegate.swift
  98. 113
      Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/Contents.json
  99. BIN
      Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_1024x1024.png
  100. BIN
      Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_120x120-1.png

128
CODE_OF_CONDUCT.md

@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
hello@ivanvorobei.by.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

28
CONTRIBUTING.md

@ -0,0 +1,28 @@
# Contributing
Here provided more info about project, contribution process and recomended changes.
Please, read it before pull request or create issue.
## Codestyle
### Marks
For clean struct code good is using marks.
```swift
class Example {
// MARK: - Init
init() {}
}
```
Here you find all which using in project:
- // MARK: - Init
- // MARK: - Lifecycle
- // MARK: - Layout
- // MARK: - Helpers
If you can't find valid, add new to codestyle agreements please. Other can be use if class is large and need struct it even without adding to codestyle agreements.

82
Examples.xcworkspace/contents.xcworkspacedata

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Other Projects/2048 Game/SwiftUI2048.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Animating Views And Transitions/Complete/Landmarks/AnimatingViewsAndTransitions.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Building Lists And Navigation/Complete/Landmarks/BuildingListsAndNavigation.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Calculator/Calculator/Calculator.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Combine using GitHub API/SwiftUI-Combine-Example.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Composing Complex Interfaces/Complete/Landmarks/ComposingComplexInterfaces.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Creating And Combining Views/Complete/Landmarks/CreatingAndCombiningViews.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Currency-SwiftUI/Currency-SwiftUI.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Drawing Paths And Shapes/Complete/Landmarks/DrawingPathsAndShapes.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Example To-Do App/SwiftUITodo.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Flux/SwiftUI-Flux.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/GitHub Search/GitHubSearchWithSwiftUI.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Handling User Input/Complete/Landmarks/HandlingUserInput.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/InstaFake/Instagram-SWUI.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Interfacing With UIKit/Complete/Landmarks/InterfacingWithUIKit.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/iPadOS Scenes/BehindTheScenes.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Jike/SwiftUI_Jike.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Movie/MovieSwift/MovieSwift.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/SwiftUI + Redux/SwiftUIDemo.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Tempus RomanumIl/TempusRomanum.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Time Travel/SwiftUITimeTravel.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Transition and Blur/Basic Animation/SwiftUI-BasicAnimation.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Transition and Blur/Card Animation/SwiftUI-CardAnimation.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/UINote/SwiftUINote.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/Working With UIControls/Complete/Landmarks/WorkingWithUIControls.xcodeproj">
</FileRef>
<FileRef
location = "group:Other Projects/WWDCPlayer/WWDCPlayer.xcodeproj">
</FileRef>
</Workspace>

8
Examples.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@ -0,0 +1,8 @@
<?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>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

122
Files/AnimatableCards.swift

@ -0,0 +1,122 @@
// The MIT License (MIT)
// Copyright © 2019 Ivan Varabei (varabeis@icloud.com)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import SwiftUI
struct ContentView: View {
@GestureState var dragState = DragState.inactive
var body: some View {
let dragGester = DragGesture()
.updating($dragState) { (value, state, transaction) in
state = .dragging(translation: value.translation)
}
return ZStack {
Card(title: "Third card")
.rotation3DEffect(Angle(degrees: dragState.isActive ? 0 : 60), axis: (x: 10.0, y: 10.0, z: 10.0))
.blendMode(.hardLight)
.padding(dragState.isActive ? 32 : 64)
.padding(.bottom, dragState.isActive ? 32 : 64)
.animation(.spring())
Card(title: "Second Card")
.rotation3DEffect(Angle(degrees: dragState.isActive ? 0 : 30), axis: (x: 10.0, y: 10.0, z: 10.0))
.blendMode(.hardLight)
.padding(dragState.isActive ? 16 : 32)
.padding(.bottom, dragState.isActive ? 0 : 32)
.animation(.spring())
MainCard(title: "Main Card")
.offset(
x: dragState.translation.width,
y: dragState.translation.height
)
.rotationEffect(Angle(degrees: Double(dragState.translation.width / 10)))
.shadow(radius: dragState.isActive ? 8 : 0)
.animation(.spring())
.gesture(dragGester)
}
}
enum DragState {
case inactive
case dragging(translation: CGSize)
var translation: CGSize {
switch self {
case .inactive:
return .zero
case .dragging(let translation):
return translation
}
}
var isActive: Bool {
switch self {
case .inactive:
return false
case .dragging:
return true
}
}
}
}
struct Card: View {
var title: String
var body: some View {
ZStack {
Rectangle()
.fill(Color(red: 68 / 255, green: 41 / 255, blue: 182 / 255))
.frame(height: 230)
.cornerRadius(10)
.padding(16)
Text(title)
.color(.white)
.font(.title)
.bold()
}
}
}
struct MainCard: View {
var title: String
var body: some View {
ZStack {
Rectangle()
.fill(Color.black)
.frame(height: 230)
.cornerRadius(10)
.padding(16)
Text(title)
.color(.white)
.font(.largeTitle)
.bold()
}
}
}

79
Files/AreaToCard.swift

@ -0,0 +1,79 @@
// The MIT License (MIT)
// Copyright © 2019 Ivan Varabei (varabeis@icloud.com)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import SwiftUI
struct ContentView : View {
@State var show = false
var body: some View {
VStack() {
Text("Card in SwiftUI")
.foregroundColor(.white)
.fontWeight(.bold)
.font(.largeTitle)
.padding(.top, show ? 30 : 20)
.padding(.bottom, show ? 20 : 0)
Text("Animatable cards with Spring, custom frame and some paddings. Also use SFSymbol for icon in the bottom button. Tap to button fo see fill style of this icon.")
.foregroundColor(.white)
.multilineTextAlignment(.center)
.animation(.spring())
.cornerRadius(0)
.lineLimit(.none)
Spacer()
Button(action: {
self.show.toggle()
}) {
HStack {
Image(systemName: show ? "slash.circle.fill" : "slash.circle")
.foregroundColor(Color(hue: 0.498, saturation: 0.609, brightness: 1.0))
.font(Font.title.weight(.semibold))
.imageScale(.small)
Text(show ? "to Card" : "to Area")
.foregroundColor(Color(hue: 0.498, saturation: 0.609, brightness: 1.0))
.fontWeight(.bold)
.font(.title)
.cornerRadius(0)
}
}
.padding(.bottom, show ? 20 : 15)
}
.padding()
.padding(.top, 15)
.frame(width: show ? 350 : 290, height: show ? 420 : 260)
.background(Color.blue)
.cornerRadius(30)
.animation(.spring())
}
}
#if DEBUG
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif

21
LICENSE

@ -0,0 +1,21 @@
MIT License
Copyright © 2020 Ivan Vorobei
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

0
Other Projects/2048 Game/LICENSE

0
Other Projects/2048 Game/Screenshot.png

407
Other Projects/2048 Game/SwiftUI2048.xcodeproj/project.pbxproj

@ -0,0 +1,407 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
FA132EFA22A94D9400BD9743 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA132EF922A94D9400BD9743 /* MainMenu.xib */; };
FA633E1F22A77D1C00DE6288 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA633E1E22A77D1C00DE6288 /* AppDelegate.swift */; };
FA633E2522A77D1D00DE6288 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA633E2422A77D1D00DE6288 /* Assets.xcassets */; };
FA633E2822A77D1D00DE6288 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA633E2722A77D1D00DE6288 /* Preview Assets.xcassets */; };
FA633E2B22A77D1D00DE6288 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FA633E2922A77D1D00DE6288 /* LaunchScreen.storyboard */; };
FA633E3422A77D5700DE6288 /* BlockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA633E3322A77D5700DE6288 /* BlockView.swift */; };
FA633E3722A7928500DE6288 /* BlockMatrix.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA633E3622A7928400DE6288 /* BlockMatrix.swift */; };
FA633E3922A79AFA00DE6288 /* GameLogic.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA633E3822A79AFA00DE6288 /* GameLogic.swift */; };
FA633E3B22A79B1200DE6288 /* GameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA633E3A22A79B1200DE6288 /* GameView.swift */; };
FA633E3D22A79B3C00DE6288 /* BlockGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA633E3C22A79B3C00DE6288 /* BlockGridView.swift */; };
FA633E3F22A7BDBB00DE6288 /* IdentifiedBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA633E3E22A7BDBB00DE6288 /* IdentifiedBlock.swift */; };
FA633E4622A800AB00DE6288 /* Screenshot.png in Resources */ = {isa = PBXBuildFile; fileRef = FA633E4522A800AB00DE6288 /* Screenshot.png */; };
FA633E4822A8019D00DE6288 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = FA633E4722A8019D00DE6288 /* LICENSE */; };
FA6F2B2122A81832009C2D3B /* FunctionalUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA6F2B2022A81832009C2D3B /* FunctionalUtils.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
FA132EF822A90EFD00BD9743 /* SwiftUI2048.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SwiftUI2048.entitlements; sourceTree = "<group>"; };
FA132EF922A94D9400BD9743 /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = "<group>"; };
FA633E1B22A77D1C00DE6288 /* 2048.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 2048.app; sourceTree = BUILT_PRODUCTS_DIR; };
FA633E1E22A77D1C00DE6288 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
FA633E2422A77D1D00DE6288 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
FA633E2722A77D1D00DE6288 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
FA633E2A22A77D1D00DE6288 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
FA633E2C22A77D1D00DE6288 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
FA633E3322A77D5700DE6288 /* BlockView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockView.swift; sourceTree = "<group>"; };
FA633E3622A7928400DE6288 /* BlockMatrix.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockMatrix.swift; sourceTree = "<group>"; };
FA633E3822A79AFA00DE6288 /* GameLogic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameLogic.swift; sourceTree = "<group>"; };
FA633E3A22A79B1200DE6288 /* GameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameView.swift; sourceTree = "<group>"; };
FA633E3C22A79B3C00DE6288 /* BlockGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockGridView.swift; sourceTree = "<group>"; };
FA633E3E22A7BDBB00DE6288 /* IdentifiedBlock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdentifiedBlock.swift; sourceTree = "<group>"; };
FA633E4222A7FFD000DE6288 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
FA633E4522A800AB00DE6288 /* Screenshot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Screenshot.png; sourceTree = "<group>"; };
FA633E4722A8019D00DE6288 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
FA6F2B2022A81832009C2D3B /* FunctionalUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FunctionalUtils.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
FA633E1822A77D1C00DE6288 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
FA633E1222A77D1C00DE6288 = {
isa = PBXGroup;
children = (
FA633E4722A8019D00DE6288 /* LICENSE */,
FA633E4222A7FFD000DE6288 /* README.md */,
FA633E4522A800AB00DE6288 /* Screenshot.png */,
FA633E1D22A77D1C00DE6288 /* SwiftUI2048 */,
FA633E1C22A77D1C00DE6288 /* Products */,
);
sourceTree = "<group>";
};
FA633E1C22A77D1C00DE6288 /* Products */ = {
isa = PBXGroup;
children = (
FA633E1B22A77D1C00DE6288 /* 2048.app */,
);
name = Products;
sourceTree = "<group>";
};
FA633E1D22A77D1C00DE6288 /* SwiftUI2048 */ = {
isa = PBXGroup;
children = (
FA132EF822A90EFD00BD9743 /* SwiftUI2048.entitlements */,
FA6F2B2022A81832009C2D3B /* FunctionalUtils.swift */,
FA633E3522A7926200DE6288 /* Models */,
FA633E3222A77D3400DE6288 /* Views */,
FA633E1E22A77D1C00DE6288 /* AppDelegate.swift */,
FA633E2422A77D1D00DE6288 /* Assets.xcassets */,
FA633E2922A77D1D00DE6288 /* LaunchScreen.storyboard */,
FA132EF922A94D9400BD9743 /* MainMenu.xib */,
FA633E2C22A77D1D00DE6288 /* Info.plist */,
FA633E2622A77D1D00DE6288 /* Preview Content */,
);
path = SwiftUI2048;
sourceTree = "<group>";
};
FA633E2622A77D1D00DE6288 /* Preview Content */ = {
isa = PBXGroup;
children = (
FA633E2722A77D1D00DE6288 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
FA633E3222A77D3400DE6288 /* Views */ = {
isa = PBXGroup;
children = (
FA633E3322A77D5700DE6288 /* BlockView.swift */,
FA633E3C22A79B3C00DE6288 /* BlockGridView.swift */,
FA633E3A22A79B1200DE6288 /* GameView.swift */,
);
path = Views;
sourceTree = "<group>";
};
FA633E3522A7926200DE6288 /* Models */ = {
isa = PBXGroup;
children = (
FA633E3622A7928400DE6288 /* BlockMatrix.swift */,
FA633E3822A79AFA00DE6288 /* GameLogic.swift */,
FA633E3E22A7BDBB00DE6288 /* IdentifiedBlock.swift */,
);
path = Models;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
FA633E1A22A77D1C00DE6288 /* 2048 */ = {
isa = PBXNativeTarget;
buildConfigurationList = FA633E2F22A77D1D00DE6288 /* Build configuration list for PBXNativeTarget "2048" */;
buildPhases = (
FA633E1722A77D1C00DE6288 /* Sources */,
FA633E1822A77D1C00DE6288 /* Frameworks */,
FA633E1922A77D1C00DE6288 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = 2048;
productName = SwiftUI2048;
productReference = FA633E1B22A77D1C00DE6288 /* 2048.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
FA633E1322A77D1C00DE6288 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1100;
LastUpgradeCheck = 1100;
ORGANIZATIONNAME = Cyandev;
TargetAttributes = {
FA633E1A22A77D1C00DE6288 = {
CreatedOnToolsVersion = 11.0;
};
};
};
buildConfigurationList = FA633E1622A77D1C00DE6288 /* Build configuration list for PBXProject "SwiftUI2048" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = FA633E1222A77D1C00DE6288;
productRefGroup = FA633E1C22A77D1C00DE6288 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
FA633E1A22A77D1C00DE6288 /* 2048 */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
FA633E1922A77D1C00DE6288 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
FA633E2B22A77D1D00DE6288 /* LaunchScreen.storyboard in Resources */,
FA633E2822A77D1D00DE6288 /* Preview Assets.xcassets in Resources */,
FA633E2522A77D1D00DE6288 /* Assets.xcassets in Resources */,
FA633E4622A800AB00DE6288 /* Screenshot.png in Resources */,
FA633E4822A8019D00DE6288 /* LICENSE in Resources */,
FA132EFA22A94D9400BD9743 /* MainMenu.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
FA633E1722A77D1C00DE6288 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
FA633E3F22A7BDBB00DE6288 /* IdentifiedBlock.swift in Sources */,
FA6F2B2122A81832009C2D3B /* FunctionalUtils.swift in Sources */,
FA633E3922A79AFA00DE6288 /* GameLogic.swift in Sources */,
FA633E3422A77D5700DE6288 /* BlockView.swift in Sources */,
FA633E3D22A79B3C00DE6288 /* BlockGridView.swift in Sources */,
FA633E1F22A77D1C00DE6288 /* AppDelegate.swift in Sources */,
FA633E3722A7928500DE6288 /* BlockMatrix.swift in Sources */,
FA633E3B22A79B1200DE6288 /* GameView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
FA633E2922A77D1D00DE6288 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
FA633E2A22A77D1D00DE6288 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
FA633E2D22A77D1D00DE6288 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
FA633E2E22A77D1D00DE6288 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
FA633E3022A77D1D00DE6288 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = SwiftUI2048/SwiftUI2048.entitlements;
"CODE_SIGN_IDENTITY[sdk=*]" = "";
CODE_SIGN_STYLE = Automatic;
DERIVE_UIKITFORMAC_PRODUCT_BUNDLE_IDENTIFIER = YES;
DEVELOPMENT_ASSET_PATHS = "SwiftUI2048/Preview\\ Content";
DEVELOPMENT_TEAM = 9ZS3K56XF5;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = SwiftUI2048/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.cyandev.SwiftUI2048;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTS_UIKITFORMAC = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
FA633E3122A77D1D00DE6288 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = SwiftUI2048/SwiftUI2048.entitlements;
"CODE_SIGN_IDENTITY[sdk=*]" = "";
CODE_SIGN_STYLE = Automatic;
DERIVE_UIKITFORMAC_PRODUCT_BUNDLE_IDENTIFIER = YES;
DEVELOPMENT_ASSET_PATHS = "SwiftUI2048/Preview\\ Content";
DEVELOPMENT_TEAM = 9ZS3K56XF5;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = SwiftUI2048/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.cyandev.SwiftUI2048;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTS_UIKITFORMAC = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
FA633E1622A77D1C00DE6288 /* Build configuration list for PBXProject "SwiftUI2048" */ = {
isa = XCConfigurationList;
buildConfigurations = (
FA633E2D22A77D1D00DE6288 /* Debug */,
FA633E2E22A77D1D00DE6288 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
FA633E2F22A77D1D00DE6288 /* Build configuration list for PBXNativeTarget "2048" */ = {
isa = XCConfigurationList;
buildConfigurations = (
FA633E3022A77D1D00DE6288 /* Debug */,
FA633E3122A77D1D00DE6288 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = FA633E1322A77D1C00DE6288 /* Project object */;
}

7
Other Projects/2048 Game/SwiftUI2048.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:SwiftUI2048.xcodeproj">
</FileRef>
</Workspace>

8
Other Projects/2048 Game/SwiftUI2048.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@ -0,0 +1,8 @@
<?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>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

58
Other Projects/2048 Game/SwiftUI2048/AppDelegate.swift

@ -0,0 +1,58 @@
//
// AppDelegate.swift
// SwiftUI2048
//
// Created by Hongyu on 6/5/19.
// Copyright © 2019 Cyandev. All rights reserved.
//
import UIKit
import SwiftUI
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var gameLogic: GameLogic!
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
gameLogic = GameLogic()
window = UIWindow(frame: UIScreen.main.bounds)
window!.rootViewController = UIHostingController(rootView:
GameView().environmentObject(gameLogic)
)
window!.makeKeyAndVisible()
self.becomeFirstResponder()
return true
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
@objc func newGame(_ sender: AnyObject?) {
gameLogic.newGame()
}
override func buildMenu(with builder: UIMenuBuilder) {
builder.remove(menu: .edit)
builder.remove(menu: .format)
builder.remove(menu: .view)
builder.replaceChildren(ofMenu: .file) { oldChildren in
var newChildren = oldChildren
let newGameItem = UIKeyCommand(input: "N",
modifierFlags: .command,
action: #selector(newGame(_:)))
newGameItem.title = "New Game"
newChildren.insert(newGameItem, at: 0)
return newChildren
}
}
}

98
Other Projects/2048 Game/SwiftUI2048/Assets.xcassets/AppIcon.appiconset/Contents.json

@ -0,0 +1,98 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

6
Other Projects/2048 Game/SwiftUI2048/Assets.xcassets/Contents.json

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

26
Other Projects/2048 Game/SwiftUI2048/Base.lproj/LaunchScreen.storyboard

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14810.11" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14766.13"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>

13
Other Projects/2048 Game/SwiftUI2048/FunctionalUtils.swift

@ -0,0 +1,13 @@
//
// FunctionalUtils.swift
// SwiftUI2048
//
// Created by Hongyu on 6/5/19.
// Copyright © 2019 Cyandev. All rights reserved.
//
import Foundation
func bind<T, U>(_ x: T, _ closure: (T) -> U) -> U {
return closure(x)
}

45
Other Projects/2048 Game/SwiftUI2048/Info.plist

@ -0,0 +1,45 @@
<?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>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>2048</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

20
Other Projects/2048 Game/SwiftUI2048/MainMenu.xib

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14810.11" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14766.13"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="AppDelegate" customModule="_048"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<command title="New Game" input="n" id="TrP-zF-WNW">
<keyModifierFlags key="modifierFlags" command="YES"/>
<alternates>
<commandAlternate title="a" actionName="newGame:" id="Fnd-9b-r2T"/>
</alternates>
<connections>
<action selector="newGame:" destination="-2" id="AQs-UV-nU7"/>
</connections>
</command>
</objects>
</document>

127
Other Projects/2048 Game/SwiftUI2048/Models/BlockMatrix.swift

@ -0,0 +1,127 @@
//
// BlockMatrix.swift
// SwiftUI2048
//
// Created by Hongyu on 6/5/19.
// Copyright © 2019 Cyandev. All rights reserved.
//
import Foundation
protocol Block {
associatedtype Value
var number: Value { get set }
}
struct IndexedBlock<T> {
let index: (Int, Int)
let item: T?
}
struct BlockMatrix<T> : CustomDebugStringConvertible where T: Block {
typealias Index = (Int, Int)
fileprivate var matrix: [[T?]]
init() {
matrix = [[T?]]()
for _ in 0..<4 {
var row = [T?]()
for _ in 0..<4 {
row.append(nil)
}
matrix.append(row)
}
}
var debugDescription: String {
matrix.map { row -> String in
row.map {
if $0 == nil {
return " "
} else {
return String(describing: $0!.number)
}
}.joined(separator: "\t")
}.joined(separator: "\n")
}
var flatten: [IndexedBlock<T>] {
return self.matrix.enumerated().flatMap { (y: Int, element: [T?]) in
element.enumerated().map { (x: Int, element: T?) in
return IndexedBlock(index: (x, y), item: element)
}
}
}
subscript(index: Self.Index) -> T? {
guard isIndexValid(index) else {
return nil
}
return matrix[index.1][index.0]
}
/// Move the block to specific location and leave the original location blank.
/// - Parameter from: Source location
/// - Parameter to: Destination location
mutating func move(from: Self.Index, to: Self.Index) {
guard isIndexValid(from) && isIndexValid(to) else {
// TODO: Throw an error?
return
}
guard let source = self[from] else {
return
}
matrix[to.1][to.0] = source
matrix[from.1][from.0] = nil
}
/// Move the block to specific location, change its value and leave the original location blank.
/// - Parameter from: Source location
/// - Parameter to: Destination location
/// - Parameter newValue: The new value
mutating func move(from: Self.Index, to: Self.Index, with newValue: T.Value) {
guard isIndexValid(from) && isIndexValid(to) else {
// TODO: Throw an error?
return
}
guard var source = self[from] else {
return
}
source.number = newValue
matrix[to.1][to.0] = source
matrix[from.1][from.0] = nil
}
/// Place a block to specific location.
/// - Parameter block: The block to place
/// - Parameter to: Destination location
mutating func place(_ block: T?, to: Self.Index) {
matrix[to.1][to.0] = block
}
fileprivate func isIndexValid(_ index: Self.Index) -> Bool {
guard index.0 >= 0 && index.0 < 4 else {
return false
}
guard index.1 >= 0 && index.1 < 4 else {
return false
}
return true
}
}

176
Other Projects/2048 Game/SwiftUI2048/Models/GameLogic.swift

@ -0,0 +1,176 @@
//
// GameLogic.swift
// SwiftUI2048
//
// Created by Hongyu on 6/5/19.
// Copyright © 2019 Cyandev. All rights reserved.
//
import Foundation
import SwiftUI
import Combine
final class GameLogic : ObservableObject {
enum Direction {
case left
case right
case up
case down
}
typealias BlockMatrixType = BlockMatrix<IdentifiedBlock>
let objectWillChange = PassthroughSubject<GameLogic, Never>()
fileprivate var _blockMatrix: BlockMatrixType!
var blockMatrix: BlockMatrixType {
return _blockMatrix
}
fileprivate var _globalID = 0
fileprivate var newGlobalID: Int {
_globalID += 1
return _globalID
}
init() {
newGame()
}
func newGame() {
_blockMatrix = BlockMatrixType()
generateNewBlocks()
objectWillChange.send(self)
}
func move(_ direction: Direction) {
defer {
objectWillChange.send(self)
}
var moved = false
let axis = direction == .left || direction == .right
for row in 0..<4 {
var rowSnapshot = [IdentifiedBlock?]()
var compactRow = [IdentifiedBlock]()
for col in 0..<4 {
// Transpose if necessary.
if let block = _blockMatrix[axis ? (col, row) : (row, col)] {
rowSnapshot.append(block)
compactRow.append(block)
}
rowSnapshot.append(nil)
}
merge(blocks: &compactRow, reverse: direction == .down || direction == .right)
var newRow = [IdentifiedBlock?]()
compactRow.forEach { newRow.append($0) }
if compactRow.count < 4 {
for _ in 0..<(4 - compactRow.count) {
if direction == .left || direction == .up {
newRow.append(nil)
} else {
newRow.insert(nil, at: 0)
}
}
}
newRow.enumerated().forEach {
if rowSnapshot[$0]?.number != $1?.number {
moved = true
}
_blockMatrix.place($1, to: axis ? ($0, row) : (row, $0))
}
}
if moved {
generateNewBlocks()
}
}
fileprivate func merge(blocks: inout [IdentifiedBlock], reverse: Bool) {
if reverse {
blocks = blocks.reversed()
}
blocks = blocks
.map { (false, $0) }
.reduce([(Bool, IdentifiedBlock)]()) { acc, item in
if acc.last?.0 == false && acc.last?.1.number == item.1.number {
var accPrefix = Array(acc.dropLast())
var mergedBlock = item.1
mergedBlock.number *= 2
accPrefix.append((true, mergedBlock))
return accPrefix
} else {
var accTmp = acc
accTmp.append((false, item.1))
return accTmp
}
}
.map { $0.1 }
if reverse {
blocks = blocks.reversed()
}
}
@discardableResult fileprivate func generateNewBlocks() -> Bool {
var blankLocations = [BlockMatrixType.Index]()
for rowIndex in 0..<4 {
for colIndex in 0..<4 {
let index = (colIndex, rowIndex)
if _blockMatrix[index] == nil {
blankLocations.append(index)
}
}
}
guard blankLocations.count >= 2 else {
return false
}
// Don't forget to sync data.
defer {
objectWillChange.send(self)
}
// Place the first block.
var placeLocIndex = Int.random(in: 0..<blankLocations.count)
_blockMatrix.place(IdentifiedBlock(id: newGlobalID, number: 2), to: blankLocations[placeLocIndex])
// Place the second block.
guard let lastLoc = blankLocations.last else {
return false
}
blankLocations[placeLocIndex] = lastLoc
placeLocIndex = Int.random(in: 0..<(blankLocations.count - 1))
_blockMatrix.place(IdentifiedBlock(id: newGlobalID, number: 2), to: blankLocations[placeLocIndex])
return true
}
// fileprivate func forEachBlockIndices(mode: ForEachMode = .rowByRow,
// reversed: Bool = false,
// _ action: (BlockMatrixType.Index) -> ()) {
// var indices = (0..<4).map { $0 }
// if reversed {
// indices = indices.reversed()
// }
//
// for row in indices {
// for col in indices {
// if mode == .rowByRow {
// action((col, row))
// } else {
// action((row, col)) // transpose
// }
// }
// }
// }
}

16
Other Projects/2048 Game/SwiftUI2048/Models/IdentifiedBlock.swift

@ -0,0 +1,16 @@
//
// IdentifiedBlock.swift
// SwiftUI2048
//
// Created by Hongyu on 6/5/19.
// Copyright © 2019 Cyandev. All rights reserved.
//
import Foundation
struct IdentifiedBlock: Block {
let id: Int
var number: Int
}

6
Other Projects/2048 Game/SwiftUI2048/Preview Content/Preview Assets.xcassets/Contents.json

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

10
Other Projects/2048 Game/SwiftUI2048/SwiftUI2048.entitlements

@ -0,0 +1,10 @@
<?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>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>

116
Other Projects/2048 Game/SwiftUI2048/Views/BlockGridView.swift

@ -0,0 +1,116 @@
//
// BlockGridView.swift
// SwiftUI2048
//
// Created by Hongyu on 6/5/19.
// Copyright © 2019 Cyandev. All rights reserved.
//
import SwiftUI
fileprivate struct IdentifiableIndexedBlock : Identifiable {
typealias ID = String
typealias IdentifiedValue = IndexedBlock<IdentifiedBlock>
static var uniqueBlankId = 0
let indexedBlock: IndexedBlock<IdentifiedBlock>
var id: Self.ID {
if let id = indexedBlock.item?.id {
return "\(id)"
}
// TODO: (Refactor) Don't mix two types of block views.
IdentifiableIndexedBlock.uniqueBlankId += 1
return "Blank_\(IdentifiableIndexedBlock.uniqueBlankId)"
}
var identifiedValue: Self.IdentifiedValue {
return indexedBlock
}
}
extension AnyTransition {
static func blockAppear(from: Edge) -> AnyTransition {
return .asymmetric(
insertion: AnyTransition.opacity
.combined(with: .move(edge: from)),
removal: .identity)
}
}
struct BlockGridView : View {
typealias SupportingMatrix = BlockMatrix<IdentifiedBlock>
let matrix: Self.SupportingMatrix
let blockEnterEdge: Edge
func createBlock(_ block: IdentifiedBlock?) -> some View {
if let block = block {
return BlockView(number: block.number)
}
return BlockView.blank()
}
// FIXME: This is existed as a workaround for a Swift compiler bug.
func zIndex(_ block: IdentifiedBlock?) -> Double {
if block == nil {
return 1
}
return 1000
}
var body: some View {
ZStack {
ForEach(
self.matrix.flatten.map { IdentifiableIndexedBlock(indexedBlock: $0) }
) { block in
self.createBlock(block.item)
.frame(width: 65, height: 65, alignment: .center)
.position(x: CGFloat(block.index.0) * (65 + 12) + 32.5 + 12,
y: CGFloat(block.index.1) * (65 + 12) + 32.5 + 12)
.zIndex(self.zIndex(block.item))
.transition(.blockAppear(from: self.blockEnterEdge))
// .animation(block.item == nil ? nil : .spring(mass: 1, stiffness: 400, damping: 56, initialVelocity: 0))
}
}
.frame(width: 320, height: 320, alignment: .center)
.background(
Rectangle()
.fill(Color(red:0.72, green:0.66, blue:0.63, opacity:1.00))
)
.clipped()
.cornerRadius(6)
}
}
#if DEBUG
struct BlockGridView_Previews : PreviewProvider {
static var matrix: BlockGridView.SupportingMatrix {
var _matrix = BlockGridView.SupportingMatrix()
_matrix.place(IdentifiedBlock(id: 1, number: 2), to: (2, 0))
_matrix.place(IdentifiedBlock(id: 2, number: 2), to: (3, 0))
_matrix.place(IdentifiedBlock(id: 3, number: 8), to: (1, 1))
_matrix.place(IdentifiedBlock(id: 4, number: 4), to: (2, 1))
_matrix.place(IdentifiedBlock(id: 5, number: 512), to: (3, 3))
_matrix.place(IdentifiedBlock(id: 6, number: 1024), to: (2, 3))
_matrix.place(IdentifiedBlock(id: 7, number: 16), to: (0, 3))
_matrix.place(IdentifiedBlock(id: 8, number: 8), to: (1, 3))
return _matrix
}
static var previews: some View {
BlockGridView(matrix: matrix, blockEnterEdge: .top)
.previewLayout(.sizeThatFits)
}
}
#endif

118
Other Projects/2048 Game/SwiftUI2048/Views/BlockView.swift

@ -0,0 +1,118 @@
//
// BlockView.swift
// SwiftUI2048
//
// Created by Hongyu on 6/5/19.
// Copyright © 2019 Cyandev. All rights reserved.
//
import SwiftUI
struct BlockView : View {
fileprivate let colorScheme: [(Color, Color)] = [
// 2
(Color(red:0.91, green:0.87, blue:0.83, opacity:1.00), Color(red:0.42, green:0.39, blue:0.35, opacity:1.00)),
// 4
(Color(red:0.90, green:0.86, blue:0.76, opacity:1.00), Color(red:0.42, green:0.39, blue:0.35, opacity:1.00)),
// 8
(Color(red:0.93, green:0.67, blue:0.46, opacity:1.00), Color.white),
// 16
(Color(red:0.94, green:0.57, blue:0.38, opacity:1.00), Color.white),
// 32
(Color(red:0.95, green:0.46, blue:0.33, opacity:1.00), Color.white),
// 64
(Color(red:0.94, green:0.35, blue:0.23, opacity:1.00), Color.white),
// 128
(Color(red:0.91, green:0.78, blue:0.43, opacity:1.00), Color.white),
// 256
(Color(red:0.91, green:0.78, blue:0.37, opacity:1.00), Color.white),
// 512
(Color(red:0.90, green:0.77, blue:0.31, opacity:1.00), Color.white),
// 1024
(Color(red:0.91, green:0.75, blue:0.24, opacity:1.00), Color.white),
// 2048
(Color(red:0.91, green:0.74, blue:0.18, opacity:1.00), Color.white),
]
fileprivate let number: Int?
init(number: Int) {
self.number = number
}
fileprivate init() {
self.number = nil
}
static func blank() -> Self {
return self.init()
}
fileprivate var numberText: String {
guard let number = number else {
return ""
}
return String(number)
}
fileprivate var fontSize: CGFloat {
let textLength = numberText.count
if textLength < 3 {
return 32
} else if textLength < 4 {
return 18
} else {
return 12
}
}
fileprivate var colorPair: (Color, Color) {
guard let number = number else {
return (Color(red:0.78, green:0.73, blue:0.68, opacity:1.00), Color.black)
}
let index = Int(log2(Double(number))) - 1
if index < 0 || index >= colorScheme.count {
fatalError("No color for such number")
}
return colorScheme[index]
}
// MARK: Body
var body: some View {
ZStack {
Rectangle().fill(colorPair.0)
Text(numberText)
.font(Font.system(size: fontSize).bold())
.foregroundColor(colorPair.1)
.id(numberText)
.transition(AnyTransition.scale(scale: 0.5, anchor: .center).combined(with: .opacity))
// .animation(.fluidSpring())
}
.clipped()
.cornerRadius(6)
}
}
// MARK: - Previews
#if DEBUG
struct BlockView_Previews : PreviewProvider {
static var previews: some View {
Group {
ForEach((1...11).map { Int(pow(2.0, Double($0))) }, id: \.self) { i in
BlockView(number: i)
.previewLayout(.sizeThatFits)
}
BlockView.blank()
.previewLayout(.sizeThatFits)
}
}
}
#endif

127
Other Projects/2048 Game/SwiftUI2048/Views/GameView.swift

@ -0,0 +1,127 @@
//
// GameView.swift
// SwiftUI2048
//
// Created by Hongyu on 6/5/19.
// Copyright © 2019 Cyandev. All rights reserved.
//
import SwiftUI
extension Edge {
static func from(_ from: GameLogic.Direction) -> Self {
switch from {
case .down:
return .top
case .up:
return .bottom
case .left:
return .trailing
case .right:
return .leading
}
}
}
struct GameView : View {
@State var gestureStartLocation: CGPoint = .zero
@State var lastGestureDirection: GameLogic.Direction = .up
@EnvironmentObject var gameLogic: GameLogic
fileprivate struct LayoutTraits {
let bannerOffset: CGSize
let containerAlignment: Alignment
}
fileprivate func layoutTraits(`for` proxy: GeometryProxy) -> LayoutTraits {
let landscape = proxy.size.width > proxy.size.height
return LayoutTraits(
bannerOffset: landscape
? .init(width: proxy.safeAreaInsets.leading + 32, height: 0)
: .init(width: 0, height: proxy.safeAreaInsets.top + 32),
containerAlignment: landscape ? .leading : .top
)
}
var gesture: some Gesture {
let threshold: CGFloat = 44
let drag = DragGesture()
.onChanged { v in
guard self.gestureStartLocation != v.startLocation else { return }
withTransaction(Transaction()) {
self.gestureStartLocation = v.startLocation
if v.translation.width > threshold {
// Move right
self.gameLogic.move(.right)
self.lastGestureDirection = .right
} else if v.translation.width < -threshold {
// Move left
self.gameLogic.move(.left)
self.lastGestureDirection = .left
} else if v.translation.height > threshold {
// Move down
self.gameLogic.move(.down)
self.lastGestureDirection = .down
} else if v.translation.height < -threshold {
// Move up
self.gameLogic.move(.up)
self.lastGestureDirection = .up
} else {
// Direction cannot be deduced, reset gesture state.
self.gestureStartLocation = .zero
}
}
// After the scene is updated, reset the last gesture direction
// to make sure the animation is right when user starts a new
// game.
OperationQueue.main.addOperation {
self.lastGestureDirection = .up
}
}
return drag
}
var body: some View {
GeometryReader { proxy in
bind(self.layoutTraits(for: proxy)) { layoutTraits in
ZStack(alignment: layoutTraits.containerAlignment) {
Text("2048")
.font(Font.system(size: 48).weight(.black))
.foregroundColor(Color(red:0.47, green:0.43, blue:0.40, opacity:1.00))
.offset(layoutTraits.bannerOffset)
ZStack(alignment: .top) {
BlockGridView(matrix: self.gameLogic.blockMatrix,
blockEnterEdge: .from(self.lastGestureDirection))
.gesture(self.gesture)
}
.frame(width: proxy.size.width, height: proxy.size.height, alignment: .center)
}
.frame(width: proxy.size.width, height: proxy.size.height, alignment: .center)
.background(
Rectangle().fill(Color(red:0.96, green:0.94, blue:0.90, opacity:1.00))
)
}
}
.edgesIgnoringSafeArea(.all)
}
}
#if DEBUG
struct GameView_Previews : PreviewProvider {
static var previews: some View {
GameView()
.environmentObject(GameLogic())
}
}
#endif

21
Other Projects/Animating Views And Transitions/Complete/.gitignore

@ -0,0 +1,21 @@
# See LICENSE folder for this sample’s licensing information.
#
# Apple sample code gitignore configuration.
# Finder
.DS_Store
# Xcode - User files
xcuserdata/
**/*.xcodeproj/project.xcworkspace/*
!**/*.xcodeproj/project.xcworkspace/xcshareddata
**/*.xcodeproj/project.xcworkspace/xcshareddata/*
!**/*.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
**/*.playground/playground.xcworkspace/*
!**/*.playground/playground.xcworkspace/xcshareddata
**/*.playground/playground.xcworkspace/xcshareddata/*
!**/*.playground/playground.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

13
Other Projects/Animating Views And Transitions/Complete/Configuration/SampleCode.xcconfig

@ -0,0 +1,13 @@
//
// See LICENSE folder for this sample’s licensing information.
//
// SampleCode.xcconfig
//
// The `SAMPLE_CODE_DISAMBIGUATOR` configuration is to make it easier to build
// and run a sample code project. Once you set your project's development team,
// you'll have a unique bundle identifier. This is because the bundle identifier
// is derived based on the 'SAMPLE_CODE_DISAMBIGUATOR' value. Do not use this
// approach in your own projects—it's only useful for sample code projects because
// they are frequently downloaded and don't have a development team set.
SAMPLE_CODE_DISAMBIGUATOR=${DEVELOPMENT_TEAM}

8
Other Projects/Animating Views And Transitions/Complete/LICENSE/LICENSE.txt

@ -0,0 +1,8 @@
Copyright © 2019 Apple Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

5
Other Projects/Animating Views And Transitions/Complete/Landmarks/AnimatingViewsAndTransitions.xcodeproj/.xcodesamplecode.plist

@ -0,0 +1,5 @@
<?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">
<array/>
</plist>

525
Other Projects/Animating Views And Transitions/Complete/Landmarks/AnimatingViewsAndTransitions.xcodeproj/project.pbxproj

@ -0,0 +1,525 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
B7310DD1229F6839001079B9 /* HexagonParameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7310DD0229F6839001079B9 /* HexagonParameters.swift */; };
B7310DD3229F6CA9001079B9 /* Badge.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7310DD2229F6CA9001079B9 /* Badge.swift */; };
B7394866229F194000C47603 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7394865229F194000C47603 /* AppDelegate.swift */; };
B7394868229F194000C47603 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7394867229F194000C47603 /* SceneDelegate.swift */; };
B739486A229F194000C47603 /* LandmarkDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7394869229F194000C47603 /* LandmarkDetail.swift */; };
B739486C229F194200C47603 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B739486B229F194200C47603 /* Assets.xcassets */; };
B739486F229F194200C47603 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B739486E229F194200C47603 /* Preview Assets.xcassets */; };
B7394872229F194200C47603 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B7394870229F194200C47603 /* LaunchScreen.storyboard */; };
B739487A229F1B3F00C47603 /* CircleImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7394879229F1B3F00C47603 /* CircleImage.swift */; };
B739487C229F1B6800C47603 /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B739487B229F1B6800C47603 /* MapView.swift */; };
B7394881229F28B900C47603 /* Landmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = B739487F229F28B900C47603 /* Landmark.swift */; };
B7394882229F28B900C47603 /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7394880229F28B900C47603 /* Data.swift */; };
B7394891229F292F00C47603 /* rainbowlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394884229F292D00C47603 /* rainbowlake.jpg */; };
B7394893229F292F00C47603 /* icybay.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394886229F292E00C47603 /* icybay.jpg */; };
B7394894229F292F00C47603 /* lakemcdonald.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394887229F292E00C47603 /* lakemcdonald.jpg */; };
B7394895229F292F00C47603 /* turtlerock.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394888229F292E00C47603 /* turtlerock.jpg */; };
B7394896229F292F00C47603 /* umbagog.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394889229F292E00C47603 /* umbagog.jpg */; };
B7394897229F292F00C47603 /* hiddenlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B739488A229F292E00C47603 /* hiddenlake.jpg */; };
B7394898229F292F00C47603 /* stmarylake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B739488B229F292E00C47603 /* stmarylake.jpg */; };
B7394899229F292F00C47603 /* twinlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B739488C229F292E00C47603 /* twinlake.jpg */; };
B739489A229F292F00C47603 /* silversalmoncreek.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B739488D229F292E00C47603 /* silversalmoncreek.jpg */; };
B739489B229F292F00C47603 /* landmarkData.json in Resources */ = {isa = PBXBuildFile; fileRef = B739488E229F292E00C47603 /* landmarkData.json */; };
B739489C229F292F00C47603 /* chincoteague.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B739488F229F292F00C47603 /* chincoteague.jpg */; };
B739489D229F292F00C47603 /* chilkoottrail.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394890229F292F00C47603 /* chilkoottrail.jpg */; };
B739489F229F2D9700C47603 /* LandmarkRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B739489E229F2D9700C47603 /* LandmarkRow.swift */; };
B73948A1229F2E1F00C47603 /* LandmarkList.swift in Sources */ = {isa = PBXBuildFile; fileRef = B73948A0229F2E1F00C47603 /* LandmarkList.swift */; };
B73948A3229F3E2200C47603 /* charleyrivers.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B73948A2229F3E2200C47603 /* charleyrivers.jpg */; };
B7D2AAC5229F4D7C0061E5F5 /* UserData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D2AAC4229F4D7C0061E5F5 /* UserData.swift */; };
B7D587AE229F7382006E8DCF /* BadgeBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587AD229F7382006E8DCF /* BadgeBackground.swift */; };
B7D587B0229F73C1006E8DCF /* BadgeSymbol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587AF229F73C1006E8DCF /* BadgeSymbol.swift */; };
B7D587B2229F7406006E8DCF /* RotatedBadgeSymbol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587B1229F7406006E8DCF /* RotatedBadgeSymbol.swift */; };
B7D587B6229F825D006E8DCF /* HikeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587B5229F825D006E8DCF /* HikeView.swift */; };
B7D587B8229F826D006E8DCF /* GraphCapsule.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587B7229F826D006E8DCF /* GraphCapsule.swift */; };
B7D587BA229F8288006E8DCF /* Hike.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587B9229F8288006E8DCF /* Hike.swift */; };
B7D587BC229F82EB006E8DCF /* HikeDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587BB229F82EB006E8DCF /* HikeDetail.swift */; };
B7D587BE229F82FF006E8DCF /* HikeGraph.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587BD229F82FF006E8DCF /* HikeGraph.swift */; };
B7D587C0229F830B006E8DCF /* hikeData.json in Resources */ = {isa = PBXBuildFile; fileRef = B7D587BF229F830B006E8DCF /* hikeData.json */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
704D6530704D8B0000000001 /* SampleCode.xcconfig */ = {isa = PBXFileReference; name = SampleCode.xcconfig; path = ../Configuration/SampleCode.xcconfig; sourceTree = "<group>"; };
7074FA407074F5C000000001 /* LICENSE.txt */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE.txt; sourceTree = "<group>"; };
B7310DD0229F6839001079B9 /* HexagonParameters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HexagonParameters.swift; sourceTree = "<group>"; };
B7310DD2229F6CA9001079B9 /* Badge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Badge.swift; sourceTree = "<group>"; };
B7394862229F194000C47603 /* Landmarks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Landmarks.app; sourceTree = BUILT_PRODUCTS_DIR; };
B7394865229F194000C47603 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
B7394867229F194000C47603 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
B7394869229F194000C47603 /* LandmarkDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LandmarkDetail.swift; sourceTree = "<group>"; };
B739486B229F194200C47603 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
B739486E229F194200C47603 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
B7394871229F194200C47603 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
B7394873229F194200C47603 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B7394879229F1B3F00C47603 /* CircleImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleImage.swift; sourceTree = "<group>"; };
B739487B229F1B6800C47603 /* MapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView.swift; sourceTree = "<group>"; };
B739487F229F28B900C47603 /* Landmark.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Landmark.swift; sourceTree = "<group>"; };
B7394880229F28B900C47603 /* Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = "<group>"; };
B7394884229F292D00C47603 /* rainbowlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = rainbowlake.jpg; sourceTree = "<group>"; };
B7394886229F292E00C47603 /* icybay.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = icybay.jpg; sourceTree = "<group>"; };
B7394887229F292E00C47603 /* lakemcdonald.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = lakemcdonald.jpg; sourceTree = "<group>"; };
B7394888229F292E00C47603 /* turtlerock.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = turtlerock.jpg; sourceTree = "<group>"; };
B7394889229F292E00C47603 /* umbagog.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = umbagog.jpg; sourceTree = "<group>"; };
B739488A229F292E00C47603 /* hiddenlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = hiddenlake.jpg; sourceTree = "<group>"; };
B739488B229F292E00C47603 /* stmarylake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = stmarylake.jpg; sourceTree = "<group>"; };
B739488C229F292E00C47603 /* twinlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = twinlake.jpg; sourceTree = "<group>"; };
B739488D229F292E00C47603 /* silversalmoncreek.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = silversalmoncreek.jpg; sourceTree = "<group>"; };
B739488E229F292E00C47603 /* landmarkData.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = landmarkData.json; sourceTree = "<group>"; };
B739488F229F292F00C47603 /* chincoteague.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = chincoteague.jpg; sourceTree = "<group>"; };
B7394890229F292F00C47603 /* chilkoottrail.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = chilkoottrail.jpg; sourceTree = "<group>"; };
B739489E229F2D9700C47603 /* LandmarkRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LandmarkRow.swift; path = "Supporting Views/LandmarkRow.swift"; sourceTree = "<group>"; };
B73948A0229F2E1F00C47603 /* LandmarkList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LandmarkList.swift; sourceTree = "<group>"; };
B73948A2229F3E2200C47603 /* charleyrivers.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = charleyrivers.jpg; sourceTree = "<group>"; };
B7D2AAC4229F4D7C0061E5F5 /* UserData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserData.swift; sourceTree = "<group>"; };
B7D587AD229F7382006E8DCF /* BadgeBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeBackground.swift; sourceTree = "<group>"; };
B7D587AF229F73C1006E8DCF /* BadgeSymbol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeSymbol.swift; sourceTree = "<group>"; };
B7D587B1229F7406006E8DCF /* RotatedBadgeSymbol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RotatedBadgeSymbol.swift; sourceTree = "<group>"; };
B7D587B5229F825D006E8DCF /* HikeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HikeView.swift; sourceTree = "<group>"; };
B7D587B7229F826D006E8DCF /* GraphCapsule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphCapsule.swift; sourceTree = "<group>"; };
B7D587B9229F8288006E8DCF /* Hike.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Hike.swift; sourceTree = "<group>"; };
B7D587BB229F82EB006E8DCF /* HikeDetail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HikeDetail.swift; sourceTree = "<group>"; };
B7D587BD229F82FF006E8DCF /* HikeGraph.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HikeGraph.swift; sourceTree = "<group>"; };
B7D587BF229F830B006E8DCF /* hikeData.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = hikeData.json; sourceTree = "<group>"; };
C4E4AAA0C4E4035000000001 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
B739485F229F194000C47603 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
704E08B0704E8FD000000001 /* Configuration */ = {
isa = PBXGroup;
children = (
704D6530704D8B0000000001 /* SampleCode.xcconfig */,
);
name = Configuration;
sourceTree = "<group>";
};
7074E3507074EFD000000001 /* LICENSE */ = {
isa = PBXGroup;
children = (
7074FA407074F5C000000001 /* LICENSE.txt */,
);
name = LICENSE;
path = ../LICENSE;
sourceTree = "<group>";
};
B7394859229F194000C47603 = {
isa = PBXGroup;
children = (
C4E4AAA0C4E4035000000001 /* README.md */,
B7394864229F194000C47603 /* Landmarks */,
B7394863229F194000C47603 /* Products */,
704E08B0704E8FD000000001 /* Configuration */,
7074E3507074EFD000000001 /* LICENSE */,
);
sourceTree = "<group>";
};
B7394863229F194000C47603 /* Products */ = {
isa = PBXGroup;
children = (
B7394862229F194000C47603 /* Landmarks.app */,
);
name = Products;
sourceTree = "<group>";
};
B7394864229F194000C47603 /* Landmarks */ = {
isa = PBXGroup;
children = (
B739487E229F282200C47603 /* Models */,
B7394865229F194000C47603 /* AppDelegate.swift */,
B7394867229F194000C47603 /* SceneDelegate.swift */,
B73948A0229F2E1F00C47603 /* LandmarkList.swift */,
B739489E229F2D9700C47603 /* LandmarkRow.swift */,
B7394869229F194000C47603 /* LandmarkDetail.swift */,
B7D587B5229F825D006E8DCF /* HikeView.swift */,
B7D587BB229F82EB006E8DCF /* HikeDetail.swift */,
B7310DD0229F6839001079B9 /* HexagonParameters.swift */,
B739487D229F1C0100C47603 /* Supporting Views */,
B7394883229F291A00C47603 /* Resources */,
B739486B229F194200C47603 /* Assets.xcassets */,
B7394870229F194200C47603 /* LaunchScreen.storyboard */,
B7394873229F194200C47603 /* Info.plist */,
B739486D229F194200C47603 /* Preview Content */,
);
path = Landmarks;
sourceTree = "<group>";
};
B739486D229F194200C47603 /* Preview Content */ = {
isa = PBXGroup;
children = (
B739486E229F194200C47603 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
B739487D229F1C0100C47603 /* Supporting Views */ = {
isa = PBXGroup;
children = (
B7394879229F1B3F00C47603 /* CircleImage.swift */,
B739487B229F1B6800C47603 /* MapView.swift */,
B7310DD2229F6CA9001079B9 /* Badge.swift */,
B7D587AF229F73C1006E8DCF /* BadgeSymbol.swift */,
B7D587B1229F7406006E8DCF /* RotatedBadgeSymbol.swift */,
B7D587AD229F7382006E8DCF /* BadgeBackground.swift */,
B7D587BD229F82FF006E8DCF /* HikeGraph.swift */,
B7D587B7229F826D006E8DCF /* GraphCapsule.swift */,
);
path = "Supporting Views";
sourceTree = "<group>";
};
B739487E229F282200C47603 /* Models */ = {
isa = PBXGroup;
children = (
B7394880229F28B900C47603 /* Data.swift */,
B739487F229F28B900C47603 /* Landmark.swift */,
B7D587B9229F8288006E8DCF /* Hike.swift */,
B7D2AAC4229F4D7C0061E5F5 /* UserData.swift */,
);
path = Models;
sourceTree = "<group>";
};
B7394883229F291A00C47603 /* Resources */ = {
isa = PBXGroup;
children = (
B739488E229F292E00C47603 /* landmarkData.json */,
B7D587BF229F830B006E8DCF /* hikeData.json */,
B7394890229F292F00C47603 /* chilkoottrail.jpg */,
B739488F229F292F00C47603 /* chincoteague.jpg */,
B739488A229F292E00C47603 /* hiddenlake.jpg */,
B7394886229F292E00C47603 /* icybay.jpg */,
B7394887229F292E00C47603 /* lakemcdonald.jpg */,
B7394884229F292D00C47603 /* rainbowlake.jpg */,
B739488D229F292E00C47603 /* silversalmoncreek.jpg */,
B739488B229F292E00C47603 /* stmarylake.jpg */,
B7394888229F292E00C47603 /* turtlerock.jpg */,
B739488C229F292E00C47603 /* twinlake.jpg */,
B7394889229F292E00C47603 /* umbagog.jpg */,
B73948A2229F3E2200C47603 /* charleyrivers.jpg */,
);
path = Resources;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
B7394861229F194000C47603 /* Landmarks */ = {
isa = PBXNativeTarget;
buildConfigurationList = B7394876229F194200C47603 /* Build configuration list for PBXNativeTarget "Landmarks" */;
buildPhases = (
B739485E229F194000C47603 /* Sources */,
B739485F229F194000C47603 /* Frameworks */,
B7394860229F194000C47603 /* Resources */,
C602AC70C605937000000001,
);
buildRules = (
);
dependencies = (
);
name = Landmarks;
productName = Landmarks;
productReference = B7394862229F194000C47603 /* Landmarks.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
B739485A229F194000C47603 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1100;
LastUpgradeCheck = 1100;
ORGANIZATIONNAME = Apple;
TargetAttributes = {
B7394861229F194000C47603 = {
CreatedOnToolsVersion = 11.0;
};
};
};
buildConfigurationList = B739485D229F194000C47603 /* Build configuration list for PBXProject "AnimatingViewsAndTransitions" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = B7394859229F194000C47603;
productRefGroup = B7394863229F194000C47603 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
B7394861229F194000C47603 /* Landmarks */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
B7394860229F194000C47603 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B739489A229F292F00C47603 /* silversalmoncreek.jpg in Resources */,
B7394894229F292F00C47603 /* lakemcdonald.jpg in Resources */,
B7D587C0229F830B006E8DCF /* hikeData.json in Resources */,
B7394872229F194200C47603 /* LaunchScreen.storyboard in Resources */,
B73948A3229F3E2200C47603 /* charleyrivers.jpg in Resources */,
B7394891229F292F00C47603 /* rainbowlake.jpg in Resources */,
B739486F229F194200C47603 /* Preview Assets.xcassets in Resources */,
B7394895229F292F00C47603 /* turtlerock.jpg in Resources */,
B739486C229F194200C47603 /* Assets.xcassets in Resources */,
B7394899229F292F00C47603 /* twinlake.jpg in Resources */,
B7394896229F292F00C47603 /* umbagog.jpg in Resources */,
B739489D229F292F00C47603 /* chilkoottrail.jpg in Resources */,
B739489C229F292F00C47603 /* chincoteague.jpg in Resources */,
B739489B229F292F00C47603 /* landmarkData.json in Resources */,
B7394893229F292F00C47603 /* icybay.jpg in Resources */,
B7394897229F292F00C47603 /* hiddenlake.jpg in Resources */,
B7394898229F292F00C47603 /* stmarylake.jpg in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
B739485E229F194000C47603 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B7394882229F28B900C47603 /* Data.swift in Sources */,
B7310DD3229F6CA9001079B9 /* Badge.swift in Sources */,
B7394866229F194000C47603 /* AppDelegate.swift in Sources */,
B7D587B8229F826D006E8DCF /* GraphCapsule.swift in Sources */,
B739487A229F1B3F00C47603 /* CircleImage.swift in Sources */,
B739487C229F1B6800C47603 /* MapView.swift in Sources */,
B7D587BA229F8288006E8DCF /* Hike.swift in Sources */,
B7D587BC229F82EB006E8DCF /* HikeDetail.swift in Sources */,
B7D587B6229F825D006E8DCF /* HikeView.swift in Sources */,
B7310DD1229F6839001079B9 /* HexagonParameters.swift in Sources */,
B73948A1229F2E1F00C47603 /* LandmarkList.swift in Sources */,
B7D587B0229F73C1006E8DCF /* BadgeSymbol.swift in Sources */,
B7D587B2229F7406006E8DCF /* RotatedBadgeSymbol.swift in Sources */,
B7D587BE229F82FF006E8DCF /* HikeGraph.swift in Sources */,
B7394868229F194000C47603 /* SceneDelegate.swift in Sources */,
B7D587AE229F7382006E8DCF /* BadgeBackground.swift in Sources */,
B739486A229F194000C47603 /* LandmarkDetail.swift in Sources */,
B739489F229F2D9700C47603 /* LandmarkRow.swift in Sources */,
B7D2AAC5229F4D7C0061E5F5 /* UserData.swift in Sources */,
B7394881229F28B900C47603 /* Landmark.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
B7394870229F194200C47603 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
B7394871229F194200C47603 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
B7394874229F194200C47603 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 704D6530704D8B0000000001 /* SampleCode.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
B7394875229F194200C47603 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 704D6530704D8B0000000001 /* SampleCode.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
B7394877229F194200C47603 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 704D6530704D8B0000000001 /* SampleCode.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "Landmarks/Preview\\ Content";
DEVELOPMENT_TEAM = "";
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Landmarks/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.Landmarks${SAMPLE_CODE_DISAMBIGUATOR}";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
B7394878229F194200C47603 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 704D6530704D8B0000000001 /* SampleCode.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "Landmarks/Preview\\ Content";
DEVELOPMENT_TEAM = "";
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Landmarks/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.Landmarks${SAMPLE_CODE_DISAMBIGUATOR}";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
B739485D229F194000C47603 /* Build configuration list for PBXProject "AnimatingViewsAndTransitions" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B7394874229F194200C47603 /* Debug */,
B7394875229F194200C47603 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
B7394876229F194200C47603 /* Build configuration list for PBXNativeTarget "Landmarks" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B7394877229F194200C47603 /* Debug */,
B7394878229F194200C47603 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = B739485A229F194000C47603 /* Project object */;
}

8
Other Projects/Animating Views And Transitions/Complete/Landmarks/AnimatingViewsAndTransitions.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

@ -0,0 +1,8 @@
<?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>BuildSystemType</key>
<string>Latest</string>
</dict>
</plist>

36
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/AppDelegate.swift

@ -0,0 +1,36 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
The application delegate.
*/
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
}

113
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/Contents.json

@ -0,0 +1,113 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "landmark_app_icon_40x40.png",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "landmark_app_icon_58x58.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "landmark_app_icon_87x87.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "landmark_app_icon_80x80.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "landmark_app_icon_120x120.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "landmark_app_icon_120x120-1.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "landmark_app_icon_180x180.png",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "landmark_app_icon_40x40-1.png",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "landmark_app_icon_58x58-1.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "landmark_app_icon_40x40-2.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "landmark_app_icon_80x80-1.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "landmark_app_icon_76x76.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "landmark_app_icon_152x152.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "landmark_app_icon_167x167.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "landmark_app_icon_1024x1024.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_1024x1024.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_120x120-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_120x120.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_152x152.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_167x167.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_180x180.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_40x40-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_40x40-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_40x40.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_58x58-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_58x58.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_76x76.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_80x80-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_80x80.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_87x87.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

6
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/Contents.json

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

21
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/turtlerock.imageset/Contents.json

@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "turtlerock.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Assets.xcassets/turtlerock.imageset/turtlerock.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

25
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Base.lproj/LaunchScreen.storyboard

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>

57
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/HexagonParameters.swift

@ -0,0 +1,57 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
Size, position, and other information used to draw a badge.
*/
import SwiftUI
struct HexagonParameters {
struct Segment {
let useWidth: (CGFloat, CGFloat, CGFloat)
let xFactors: (CGFloat, CGFloat, CGFloat)
let useHeight: (CGFloat, CGFloat, CGFloat)
let yFactors: (CGFloat, CGFloat, CGFloat)
}
static let adjustment: CGFloat = 0.085
static let points = [
Segment(
useWidth: (1.00, 1.00, 1.00),
xFactors: (0.60, 0.40, 0.50),
useHeight: (1.00, 1.00, 0.00),
yFactors: (0.05, 0.05, 0.00)
),
Segment(
useWidth: (1.00, 1.00, 0.00),
xFactors: (0.05, 0.00, 0.00),
useHeight: (1.00, 1.00, 1.00),
yFactors: (0.20 + adjustment, 0.30 + adjustment, 0.25 + adjustment)
),
Segment(
useWidth: (1.00, 1.00, 0.00),
xFactors: (0.00, 0.05, 0.00),
useHeight: (1.00, 1.00, 1.00),
yFactors: (0.70 - adjustment, 0.80 - adjustment, 0.75 - adjustment)
),
Segment(
useWidth: (1.00, 1.00, 1.00),
xFactors: (0.40, 0.60, 0.50),
useHeight: (1.00, 1.00, 1.00),
yFactors: (0.95, 0.95, 1.00)
),
Segment(
useWidth: (1.00, 1.00, 1.00),
xFactors: (0.95, 1.00, 1.00),
useHeight: (1.00, 1.00, 1.00),
yFactors: (0.80 - adjustment, 0.70 - adjustment, 0.75 - adjustment)
),
Segment(
useWidth: (1.00, 1.00, 1.00),
xFactors: (1.00, 0.95, 1.00),
useHeight: (1.00, 1.00, 1.00),
yFactors: (0.30 + adjustment, 0.20 + adjustment, 0.25 + adjustment)
)
]
}

49
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/HikeDetail.swift

@ -0,0 +1,49 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A view showing the details for a hike.
*/
import SwiftUI
struct HikeDetail: View {
let hike: Hike
@State var dataToShow = \Hike.Observation.elevation
var buttons = [
("Elevation", \Hike.Observation.elevation),
("Heart Rate", \Hike.Observation.heartRate),
("Pace", \Hike.Observation.pace),
]
var body: some View {
return VStack {
HikeGraph(hike: hike, path: dataToShow)
.frame(height: 200, alignment: .center)
HStack(spacing: 25) {
ForEach(buttons, id: \.0) { value in
Button(action: {
self.dataToShow = value.1
}) {
Text(verbatim: value.0)
.font(.system(size: 15))
.foregroundColor(value.1 == self.dataToShow
? Color.gray
: Color.accentColor)
.animation(nil)
}
}
}
}
}
}
#if DEBUG
struct HikeDetail_Previews: PreviewProvider {
static var previews: some View {
HikeDetail(hike: hikeData[0])
}
}
#endif

68
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/HikeView.swift

@ -0,0 +1,68 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A view displaying inforamtion about a hike, including an elevation graph.
*/
import SwiftUI
struct HikeView: View {
var hike: Hike
@State private var showDetail = false
var transition: AnyTransition {
let insertion = AnyTransition.move(edge: .trailing)
.combined(with: .opacity)
let removal = AnyTransition.scale(scale: 0.0)
.combined(with: .opacity)
return .asymmetric(insertion: insertion, removal: removal)
}
var body: some View {
VStack {
HStack {
HikeGraph(hike: hike, path: \.elevation)
.frame(width: 50, height: 30)
.animation(nil)
VStack(alignment: .leading) {
Text(verbatim: hike.name)
.font(.headline)
Text(verbatim: hike.distanceText)
}
Spacer()
Button(action: {
withAnimation {
self.showDetail.toggle()
}
}) {
Image(systemName: "chevron.right.circle")
.imageScale(.large)
.rotationEffect(.degrees(showDetail ? 90 : 0))
.scaleEffect(showDetail ? 1.5 : 1)
.padding()
}
}
if showDetail {
HikeDetail(hike: hike)
.transition(transition)
}
}
}
}
#if DEBUG
struct HikeView_Previews: PreviewProvider {
static var previews: some View {
VStack {
HikeView(hike: hikeData[0])
.padding()
Spacer()
}
}
}
#endif

62
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Info.plist

@ -0,0 +1,62 @@
<?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>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
</dict>
</array>
</dict>
</dict>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

71
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/LandmarkDetail.swift

@ -0,0 +1,71 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A view showing the details for a landmark.
*/
import SwiftUI
struct LandmarkDetail: View {
@EnvironmentObject var userData: UserData
var landmark: Landmark
var landmarkIndex: Int {
userData.landmarks.firstIndex(where: { $0.id == landmark.id })!
}
var body: some View {
VStack {
MapView(coordinate: landmark.locationCoordinate)
.edgesIgnoringSafeArea(.top)
.frame(height: 300)
CircleImage(image: landmark.image(forSize: 250))
.offset(x: 0, y: -130)
.padding(.bottom, -130)
VStack(alignment: .leading) {
HStack {
Text(verbatim: landmark.name)
.font(.title)
Button(action: {
self.userData.landmarks[self.landmarkIndex]
.isFavorite.toggle()
}) {
if self.userData.landmarks[self.landmarkIndex]
.isFavorite {
Image(systemName: "star.fill")
.foregroundColor(Color.yellow)
} else {
Image(systemName: "star")
.foregroundColor(Color.gray)
}
}
}
HStack(alignment: .top) {
Text(verbatim: landmark.park)
.font(.subheadline)
Spacer()
Text(verbatim: landmark.state)
.font(.subheadline)
}
}
.padding()
Spacer()
}
}
}
#if DEBUG
struct LandmarkDetail_Preview: PreviewProvider {
static var previews: some View {
let userData = UserData()
return LandmarkDetail(landmark: userData.landmarks[0])
.environmentObject(userData)
}
}
#endif

46
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/LandmarkList.swift

@ -0,0 +1,46 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A view showing a list of landmarks.
*/
import SwiftUI
struct LandmarkList: View {
@EnvironmentObject private var userData: UserData
var body: some View {
NavigationView {
List {
Toggle(isOn: $userData.showFavoritesOnly) {
Text("Show Favorites Only")
}
ForEach(userData.landmarks) { landmark in
if !self.userData.showFavoritesOnly || landmark.isFavorite {
NavigationLink(
destination: LandmarkDetail(landmark: landmark)
.environmentObject(self.userData)) {
LandmarkRow(landmark: landmark)
}
}
}
}
.navigationBarTitle(Text("Landmarks"), displayMode: .large)
}
}
}
#if DEBUG
struct LandmarksList_Previews: PreviewProvider {
static var previews: some View {
ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
LandmarkList()
.previewDevice(PreviewDevice(rawValue: deviceName))
.previewDisplayName(deviceName)
}
.environmentObject(UserData())
}
}
#endif

95
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Models/Data.swift

@ -0,0 +1,95 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
Helpers for loading images and data.
*/
import Foundation
import CoreLocation
import UIKit
import SwiftUI
let landmarkData: [Landmark] = load("landmarkData.json")
let hikeData: [Hike] = load("hikeData.json")
func load<T: Decodable>(_ filename: String, as type: T.Type = T.self) -> T {
let data: Data
guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
else {
fatalError("Couldn't find \(filename) in main bundle.")
}
do {
data = try Data(contentsOf: file)
} catch {
fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}
do {
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
} catch {
fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
}
final class ImageStore {
fileprivate typealias _ImageDictionary = [String: [Int: CGImage]]
fileprivate var images: _ImageDictionary = [:]
fileprivate static var originalSize = 250
fileprivate static var scale = 2
static var shared = ImageStore()
func image(name: String, size: Int) -> Image {
let index = _guaranteeInitialImage(name: name)
let sizedImage = images.values[index][size]
?? _sizeImage(images.values[index][ImageStore.originalSize]!, to: size * ImageStore.scale)
images.values[index][size] = sizedImage
return Image(sizedImage, scale: CGFloat(ImageStore.scale), label: Text(verbatim: name))
}
fileprivate func _guaranteeInitialImage(name: String) -> _ImageDictionary.Index {
if let index = images.index(forKey: name) { return index }
guard
let url = Bundle.main.url(forResource: name, withExtension: "jpg"),
let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil),
let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil)
else {
fatalError("Couldn't load image \(name).jpg from main bundle.")
}
images[name] = [ImageStore.originalSize: image]
return images.index(forKey: name)!
}
fileprivate func _sizeImage(_ image: CGImage, to size: Int) -> CGImage {
guard
let colorSpace = image.colorSpace,
let context = CGContext(
data: nil,
width: size, height: size,
bitsPerComponent: image.bitsPerComponent,
bytesPerRow: image.bytesPerRow,
space: colorSpace,
bitmapInfo: image.bitmapInfo.rawValue)
else {
fatalError("Couldn't create graphics context.")
}
context.interpolationQuality = .high
context.draw(image, in: CGRect(x: 0, y: 0, width: size, height: size))
if let sizedImage = context.makeImage() {
return sizedImage
} else {
fatalError("Couldn't resize image.")
}
}
}

31
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Models/Hike.swift

@ -0,0 +1,31 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
The model for a hike.
*/
import SwiftUI
struct Hike: Codable, Hashable, Identifiable {
var name: String
var id: Int
var distance: Double
var difficulty: Int
var observations: [Observation]
static var formatter = LengthFormatter()
var distanceText: String {
return Hike.formatter
.string(fromValue: distance, unit: .kilometer)
}
struct Observation: Codable, Hashable {
var distanceFromStart: Double
var elevation: Range<Double>
var pace: Range<Double>
var heartRate: Range<Double>
}
}

42
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Models/Landmark.swift

@ -0,0 +1,42 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
The model for an individual landmark.
*/
import SwiftUI
import CoreLocation
struct Landmark: Hashable, Codable, Identifiable {
var id: Int
var name: String
fileprivate var imageName: String
fileprivate var coordinates: Coordinates
var state: String
var park: String
var category: Category
var isFavorite: Bool
var locationCoordinate: CLLocationCoordinate2D {
CLLocationCoordinate2D(
latitude: coordinates.latitude,
longitude: coordinates.longitude)
}
func image(forSize size: Int) -> Image {
ImageStore.shared.image(name: imageName, size: size)
}
enum Category: String, CaseIterable, Codable, Hashable {
case featured = "Featured"
case lakes = "Lakes"
case rivers = "Rivers"
case mountains = "Mountains"
}
}
struct Coordinates: Hashable, Codable {
var latitude: Double
var longitude: Double
}

15
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Models/UserData.swift

@ -0,0 +1,15 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A model object that stores app data.
*/
import Combine
import SwiftUI
final class UserData: ObservableObject {
@Published var showFavoritesOnly = false
@Published var landmarks = landmarkData
}

6
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Preview Content/Preview Assets.xcassets/Contents.json

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/charleyrivers.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/chilkoottrail.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/chincoteague.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/hiddenlake.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

1882
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/hikeData.json

File diff suppressed because it is too large

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/icybay.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/lakemcdonald.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

182
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/landmarkData.json

@ -0,0 +1,182 @@
[
{
"name": "Turtle Rock",
"category": "Rivers",
"city": "Twentynine Palms",
"state": "California",
"id": 1001,
"isFeatured": true,
"isFavorite": true,
"park": "Joshua Tree National Park",
"coordinates": {
"longitude": -116.166868,
"latitude": 34.011286
},
"imageName": "turtlerock"
},
{
"name": "Silver Salmon Creek",
"category": "Lakes",
"city": "Port Alsworth",
"state": "Alaska",
"id": 1002,
"isFeatured": false,
"isFavorite": false,
"park": "Lake Clark National Park and Preserve",
"coordinates": {
"longitude": -152.665167,
"latitude": 59.980167
},
"imageName": "silversalmoncreek"
},
{
"name": "Chilkoot Trail",
"category": "Mountains",
"city": "Skagway",
"state": "Alaska",
"id": 1003,
"isFeatured": false,
"isFavorite": true,
"park": "Klondike Gold Rush National Historical Park",
"coordinates": {
"longitude": -135.334571,
"latitude": 59.560551
},
"imageName": "chilkoottrail"
},
{
"name": "St. Mary Lake",
"category": "Lakes",
"city": "Browning",
"state": "Montana",
"id": 1004,
"isFeatured": true,
"isFavorite": true,
"park": "Glacier National Park",
"coordinates": {
"longitude": -113.536248,
"latitude": 48.69423
},
"imageName": "stmarylake"
},
{
"name": "Twin Lake",
"category": "Lakes",
"city": "Twin Lakes",
"state": "Alaska",
"id": 1005,
"isFeatured": false,
"isFavorite": false,
"park": "Lake Clark National Park and Preserve",
"coordinates": {
"longitude": -153.849883,
"latitude": 60.641684
},
"imageName": "twinlake"
},
{
"name": "Lake McDonald",
"category": "Mountains",
"city": "West Glacier",
"state": "Montana",
"id": 1006,
"isFeatured": false,
"isFavorite": false,
"park": "Glacier National Park",
"coordinates": {
"longitude": -113.934831,
"latitude": 48.56002
},
"imageName": "lakemcdonald"
},
{
"name": "Charley Rivers",
"category": "Rivers",
"city": "Eaking",
"state": "Alaska",
"id": 1007,
"isFeatured": true,
"isFavorite": false,
"park": "Charley Rivers National Preserve",
"coordinates": {
"longitude": -143.122586,
"latitude": 65.350021
},
"imageName": "charleyrivers",
},
{
"name": "Icy Bay",
"category": "Mountains",
"city": "Icy Bay",
"state": "Alaska",
"id": 1008,
"isFeatured": false,
"isFavorite": false,
"park": "Wrangell-St. Elias National Park and Preserve",
"coordinates": {
"longitude": -141.518167,
"latitude": 60.089917
},
"imageName": "icybay"
},
{
"name": "Rainbow Lake",
"category": "Lakes",
"city": "Willow",
"state": "Alaska",
"id": 1009,
"isFeatured": false,
"isFavorite": false,
"park": "State Recreation Area",
"coordinates": {
"longitude": -150.086103,
"latitude": 61.694334
},
"imageName": "rainbowlake"
},
{
"name": "Hidden Lake",
"category": "Lakes",
"city": "Newhalem",
"state": "Washington",
"id": 1010,
"isFeatured": false,
"isFavorite": false,
"park": "North Cascades National Park",
"coordinates": {
"longitude": -121.17799,
"latitude": 48.495442
},
"imageName": "hiddenlake"
},
{
"name": "Chincoteague",
"category": "Rivers",
"city": "Chincoteague",
"state": "Virginia",
"id": 1011,
"isFeatured": false,
"isFavorite": false,
"park": "Chincoteague National Wildlife Refuge",
"coordinates": {
"longitude": -75.383212,
"latitude": 37.91531
},
"imageName": "chincoteague"
},
{
"name": "Lake Umbagog",
"category": "Lakes",
"city": "Errol",
"state": "New Hampshire",
"id": 1012,
"isFeatured": true,
"isFavorite": false,
"park": "Umbagog National Wildlife Refuge",
"coordinates": {
"longitude": -71.056816,
"latitude": 44.747408
},
"imageName": "umbagog"
}
]

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/rainbowlake.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/silversalmoncreek.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/stmarylake.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/turtlerock.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/twinlake.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Resources/umbagog.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

58
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/SceneDelegate.swift

@ -0,0 +1,58 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
The scene delegate.
*/
import UIKit
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
// Use a UIHostingController as window root view controller
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: LandmarkList().environmentObject(UserData()))
self.window = window
window.makeKeyAndVisible()
}
}
func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
}
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
}

41
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/Badge.swift

@ -0,0 +1,41 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A view that displays a badge.
*/
import SwiftUI
struct Badge: View {
static let rotationCount = 8
var badgeSymbols: some View {
ForEach(0..<Badge.rotationCount) { i in
RotatedBadgeSymbol(
angle: .degrees(Double(i) / Double(Badge.rotationCount)) * 360.0)
}
.opacity(0.5)
}
var body: some View {
ZStack {
BadgeBackground()
GeometryReader { geometry in
self.badgeSymbols
.scaleEffect(1.0 / 4.0, anchor: .top)
.position(x: geometry.size.width / 2.0, y: (3.0 / 4.0) * geometry.size.height)
}
}
.scaledToFit()
}
}
#if DEBUG
struct Badge_Previews: PreviewProvider {
static var previews: some View {
Badge()
}
}
#endif

64
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/BadgeBackground.swift

@ -0,0 +1,64 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A view that displays the background of a badge.
*/
import SwiftUI
struct BadgeBackground: View {
var body: some View {
GeometryReader { geometry in
Path { path in
var width: CGFloat = min(geometry.size.width, geometry.size.height)
let height = width
let xScale: CGFloat = 0.832
let xOffset = (width * (1.0 - xScale)) / 2.0
width *= xScale
path.move(
to: CGPoint(
x: xOffset + width * 0.95,
y: height * (0.20 + HexagonParameters.adjustment)
)
)
HexagonParameters.points.forEach {
path.addLine(
to: .init(
x: xOffset + width * $0.useWidth.0 * $0.xFactors.0,
y: height * $0.useHeight.0 * $0.yFactors.0
)
)
path.addQuadCurve(
to: .init(
x: xOffset + width * $0.useWidth.1 * $0.xFactors.1,
y: height * $0.useHeight.1 * $0.yFactors.1
),
control: .init(
x: xOffset + width * $0.useWidth.2 * $0.xFactors.2,
y: height * $0.useHeight.2 * $0.yFactors.2
)
)
}
}
.fill(LinearGradient(
gradient: .init(colors: [Self.gradientStart, Self.gradientEnd]),
startPoint: .init(x: 0.5, y: 0),
endPoint: .init(x: 0.5, y: 0.6)
))
.aspectRatio(1, contentMode: .fit)
}
}
static let gradientStart = Color(red: 239.0 / 255, green: 120.0 / 255, blue: 221.0 / 255)
static let gradientEnd = Color(red: 239.0 / 255, green: 172.0 / 255, blue: 120.0 / 255)
}
#if DEBUG
struct BadgeBackground_Previews: PreviewProvider {
static var previews: some View {
BadgeBackground()
}
}
#endif

51
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/BadgeSymbol.swift

@ -0,0 +1,51 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A view that display a symbol in a badge.
*/
import SwiftUI
struct BadgeSymbol: View {
static let symbolColor = Color(red: 79.0 / 255, green: 79.0 / 255, blue: 191.0 / 255)
var body: some View {
GeometryReader { geometry in
Path { path in
let width = min(geometry.size.width, geometry.size.height)
let height = width * 0.75
let spacing = width * 0.030
let middle = width / 2
let topWidth = 0.226 * width
let topHeight = 0.488 * height
path.addLines([
CGPoint(x: middle, y: spacing),
CGPoint(x: middle - topWidth, y: topHeight - spacing),
CGPoint(x: middle, y: topHeight / 2 + spacing),
CGPoint(x: middle + topWidth, y: topHeight - spacing),
CGPoint(x: middle, y: spacing)
])
path.move(to: CGPoint(x: middle, y: topHeight / 2 + spacing * 3))
path.addLines([
CGPoint(x: middle - topWidth, y: topHeight + spacing),
CGPoint(x: spacing, y: height - spacing),
CGPoint(x: width - spacing, y: height - spacing),
CGPoint(x: middle + topWidth, y: topHeight + spacing),
CGPoint(x: middle, y: topHeight / 2 + spacing * 3)
])
}
.fill(Self.symbolColor)
}
}
}
#if DEBUG
struct BadgeSymbol_Previews: PreviewProvider {
static var previews: some View {
BadgeSymbol()
}
}
#endif

27
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/CircleImage.swift

@ -0,0 +1,27 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A view that clips an image to a circle and adds a stroke and shadow.
*/
import SwiftUI
struct CircleImage: View {
var image: Image
var body: some View {
image
.clipShape(Circle())
.overlay(Circle().stroke(Color.white, lineWidth: 4))
.shadow(radius: 10)
}
}
#if DEBUG
struct CircleImage_Previews: PreviewProvider {
static var previews: some View {
CircleImage(image: Image("turtlerock"))
}
}
#endif

45
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/GraphCapsule.swift

@ -0,0 +1,45 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A single line in the graph.
*/
import SwiftUI
struct GraphCapsule: View {
var index: Int
var height: CGFloat
var range: Range<Double>
var overallRange: Range<Double>
var heightRatio: CGFloat {
max(CGFloat(magnitude(of: range) / magnitude(of: overallRange)), 0.15)
}
var offsetRatio: CGFloat {
CGFloat((range.lowerBound - overallRange.lowerBound) / magnitude(of: overallRange))
}
var animation: Animation {
Animation.spring()
.speed(2)
.delay(0.03 * Double(index))
}
var body: some View {
Capsule()
.fill(Color.white)
.frame(height: height * heightRatio, alignment: .bottom)
.offset(x: 0, y: height * -offsetRatio)
.animation(animation)
}
}
#if DEBUG
struct GraphCapsule_Previews: PreviewProvider {
static var previews: some View {
GraphCapsule(index: 0, height: 150, range: 10..<50, overallRange: 0..<100)
}
}
#endif

74
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/HikeGraph.swift

@ -0,0 +1,74 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
The elevation, heart rate, and pace of a hike plotted on a graph.
*/
import SwiftUI
func rangeOfRanges<C: Collection>(_ ranges: C) -> Range<Double>
where C.Element == Range<Double> {
guard !ranges.isEmpty else { return 0..<0 }
let low = ranges.lazy.map { $0.lowerBound }.min()!
let high = ranges.lazy.map { $0.upperBound }.max()!
return low..<high
}
func magnitude(of range: Range<Double>) -> Double {
return range.upperBound - range.lowerBound
}
struct HikeGraph: View {
var hike: Hike
var path: KeyPath<Hike.Observation, Range<Double>>
var color: Color {
switch path {
case \.elevation:
return .gray
case \.heartRate:
return Color(hue: 0, saturation: 0.5, brightness: 0.7)
case \.pace:
return Color(hue: 0.7, saturation: 0.4, brightness: 0.7)
default:
return .black
}
}
var body: some View {
let data = hike.observations
let overallRange = rangeOfRanges(data.lazy.map { $0[keyPath: self.path] })
let maxMagnitude = data.map { magnitude(of: $0[keyPath: path]) }.max()!
let heightRatio = 1 - CGFloat(maxMagnitude / magnitude(of: overallRange))
return GeometryReader { proxy in
HStack(alignment: .bottom, spacing: proxy.size.width / 120) {
ForEach(data.indices) { index in
GraphCapsule(
index: index,
height: proxy.size.height,
range: data[index][keyPath: self.path],
overallRange: overallRange)
.colorMultiply(self.color)
}
.offset(x: 0, y: proxy.size.height * heightRatio)
}
}
}
}
#if DEBUG
struct HikeGraph_Previews: PreviewProvider {
static var previews: some View {
Group {
HikeGraph(hike: hikeData[0], path: \.elevation)
.frame(height: 200)
HikeGraph(hike: hikeData[0], path: \.heartRate)
.frame(height: 200)
HikeGraph(hike: hikeData[0], path: \.pace)
.frame(height: 200)
}
}
}
#endif

38
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/LandmarkRow.swift

@ -0,0 +1,38 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A single row to be displayed in a list of landmarks.
*/
import SwiftUI
struct LandmarkRow: View {
var landmark: Landmark
var body: some View {
HStack {
landmark.image(forSize: 50)
Text(verbatim: landmark.name)
Spacer()
if landmark.isFavorite {
Image(systemName: "star.fill")
.imageScale(.medium)
.foregroundColor(.yellow)
}
}
}
}
#if DEBUG
struct LandmarkRow_Previews: PreviewProvider {
static var previews: some View {
Group {
LandmarkRow(landmark: landmarkData[0])
LandmarkRow(landmark: landmarkData[1])
}
.previewLayout(.fixed(width: 300, height: 70))
}
}
#endif

31
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/MapView.swift

@ -0,0 +1,31 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A view that hosts an `MKMapView`.
*/
import SwiftUI
import MapKit
struct MapView: UIViewRepresentable {
var coordinate: CLLocationCoordinate2D
func makeUIView(context: Context) -> MKMapView {
MKMapView(frame: .zero)
}
func updateUIView(_ view: MKMapView, context: Context) {
let span = MKCoordinateSpan(latitudeDelta: 0.02, longitudeDelta: 0.02)
let region = MKCoordinateRegion(center: coordinate, span: span)
view.setRegion(region, animated: true)
}
}
#if DEBUG
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView(coordinate: landmarkData[0].locationCoordinate)
}
}
#endif

26
Other Projects/Animating Views And Transitions/Complete/Landmarks/Landmarks/Supporting Views/RotatedBadgeSymbol.swift

@ -0,0 +1,26 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
A view that displays a rotated version of a badge symbol.
*/
import SwiftUI
struct RotatedBadgeSymbol: View {
let angle: Angle
var body: some View {
BadgeSymbol()
.padding(-60)
.rotationEffect(angle, anchor: .bottom)
}
}
#if DEBUG
struct RotatedBadgeSymbol_Previews: PreviewProvider {
static var previews: some View {
RotatedBadgeSymbol(angle: .init(degrees: 5))
}
}
#endif

3
Other Projects/Animating Views And Transitions/Complete/README.md

@ -0,0 +1,3 @@
# Completed Project: Animating Views and Transitions
Explore the completed project for the [Animating Views and Transitions](https://developer.apple.com/tutorials/swiftui/animating-views-and-transitions) tutorial.

21
Other Projects/Animating Views And Transitions/StartingPoint/.gitignore

@ -0,0 +1,21 @@
# See LICENSE folder for this sample’s licensing information.
#
# Apple sample code gitignore configuration.
# Finder
.DS_Store
# Xcode - User files
xcuserdata/
**/*.xcodeproj/project.xcworkspace/*
!**/*.xcodeproj/project.xcworkspace/xcshareddata
**/*.xcodeproj/project.xcworkspace/xcshareddata/*
!**/*.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
**/*.playground/playground.xcworkspace/*
!**/*.playground/playground.xcworkspace/xcshareddata
**/*.playground/playground.xcworkspace/xcshareddata/*
!**/*.playground/playground.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

13
Other Projects/Animating Views And Transitions/StartingPoint/Configuration/SampleCode.xcconfig

@ -0,0 +1,13 @@
//
// See LICENSE folder for this sample’s licensing information.
//
// SampleCode.xcconfig
//
// The `SAMPLE_CODE_DISAMBIGUATOR` configuration is to make it easier to build
// and run a sample code project. Once you set your project's development team,
// you'll have a unique bundle identifier. This is because the bundle identifier
// is derived based on the 'SAMPLE_CODE_DISAMBIGUATOR' value. Do not use this
// approach in your own projects—it's only useful for sample code projects because
// they are frequently downloaded and don't have a development team set.
SAMPLE_CODE_DISAMBIGUATOR=${DEVELOPMENT_TEAM}

8
Other Projects/Animating Views And Transitions/StartingPoint/LICENSE/LICENSE.txt

@ -0,0 +1,8 @@
Copyright © 2019 Apple Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

5
Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/AnimatingViewsAndTransitions.xcodeproj/.xcodesamplecode.plist

@ -0,0 +1,5 @@
<?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">
<array/>
</plist>

525
Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/AnimatingViewsAndTransitions.xcodeproj/project.pbxproj

@ -0,0 +1,525 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
B7310DD1229F6839001079B9 /* HexagonParameters.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7310DD0229F6839001079B9 /* HexagonParameters.swift */; };
B7310DD3229F6CA9001079B9 /* Badge.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7310DD2229F6CA9001079B9 /* Badge.swift */; };
B7394866229F194000C47603 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7394865229F194000C47603 /* AppDelegate.swift */; };
B7394868229F194000C47603 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7394867229F194000C47603 /* SceneDelegate.swift */; };
B739486A229F194000C47603 /* LandmarkDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7394869229F194000C47603 /* LandmarkDetail.swift */; };
B739486C229F194200C47603 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B739486B229F194200C47603 /* Assets.xcassets */; };
B739486F229F194200C47603 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B739486E229F194200C47603 /* Preview Assets.xcassets */; };
B7394872229F194200C47603 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B7394870229F194200C47603 /* LaunchScreen.storyboard */; };
B739487A229F1B3F00C47603 /* CircleImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7394879229F1B3F00C47603 /* CircleImage.swift */; };
B739487C229F1B6800C47603 /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B739487B229F1B6800C47603 /* MapView.swift */; };
B7394881229F28B900C47603 /* Landmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = B739487F229F28B900C47603 /* Landmark.swift */; };
B7394882229F28B900C47603 /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7394880229F28B900C47603 /* Data.swift */; };
B7394891229F292F00C47603 /* rainbowlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394884229F292D00C47603 /* rainbowlake.jpg */; };
B7394893229F292F00C47603 /* icybay.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394886229F292E00C47603 /* icybay.jpg */; };
B7394894229F292F00C47603 /* lakemcdonald.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394887229F292E00C47603 /* lakemcdonald.jpg */; };
B7394895229F292F00C47603 /* turtlerock.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394888229F292E00C47603 /* turtlerock.jpg */; };
B7394896229F292F00C47603 /* umbagog.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394889229F292E00C47603 /* umbagog.jpg */; };
B7394897229F292F00C47603 /* hiddenlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B739488A229F292E00C47603 /* hiddenlake.jpg */; };
B7394898229F292F00C47603 /* stmarylake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B739488B229F292E00C47603 /* stmarylake.jpg */; };
B7394899229F292F00C47603 /* twinlake.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B739488C229F292E00C47603 /* twinlake.jpg */; };
B739489A229F292F00C47603 /* silversalmoncreek.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B739488D229F292E00C47603 /* silversalmoncreek.jpg */; };
B739489B229F292F00C47603 /* landmarkData.json in Resources */ = {isa = PBXBuildFile; fileRef = B739488E229F292E00C47603 /* landmarkData.json */; };
B739489C229F292F00C47603 /* chincoteague.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B739488F229F292F00C47603 /* chincoteague.jpg */; };
B739489D229F292F00C47603 /* chilkoottrail.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B7394890229F292F00C47603 /* chilkoottrail.jpg */; };
B739489F229F2D9700C47603 /* LandmarkRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B739489E229F2D9700C47603 /* LandmarkRow.swift */; };
B73948A1229F2E1F00C47603 /* LandmarkList.swift in Sources */ = {isa = PBXBuildFile; fileRef = B73948A0229F2E1F00C47603 /* LandmarkList.swift */; };
B73948A3229F3E2200C47603 /* charleyrivers.jpg in Resources */ = {isa = PBXBuildFile; fileRef = B73948A2229F3E2200C47603 /* charleyrivers.jpg */; };
B7D2AAC5229F4D7C0061E5F5 /* UserData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D2AAC4229F4D7C0061E5F5 /* UserData.swift */; };
B7D587AE229F7382006E8DCF /* BadgeBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587AD229F7382006E8DCF /* BadgeBackground.swift */; };
B7D587B0229F73C1006E8DCF /* BadgeSymbol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587AF229F73C1006E8DCF /* BadgeSymbol.swift */; };
B7D587B2229F7406006E8DCF /* RotatedBadgeSymbol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587B1229F7406006E8DCF /* RotatedBadgeSymbol.swift */; };
B7D587B6229F825D006E8DCF /* HikeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587B5229F825D006E8DCF /* HikeView.swift */; };
B7D587B8229F826D006E8DCF /* GraphCapsule.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587B7229F826D006E8DCF /* GraphCapsule.swift */; };
B7D587BA229F8288006E8DCF /* Hike.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587B9229F8288006E8DCF /* Hike.swift */; };
B7D587BC229F82EB006E8DCF /* HikeDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587BB229F82EB006E8DCF /* HikeDetail.swift */; };
B7D587BE229F82FF006E8DCF /* HikeGraph.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7D587BD229F82FF006E8DCF /* HikeGraph.swift */; };
B7D587C0229F830B006E8DCF /* hikeData.json in Resources */ = {isa = PBXBuildFile; fileRef = B7D587BF229F830B006E8DCF /* hikeData.json */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
B7310DD0229F6839001079B9 /* HexagonParameters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HexagonParameters.swift; sourceTree = "<group>"; };
B7310DD2229F6CA9001079B9 /* Badge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Badge.swift; sourceTree = "<group>"; };
B7394862229F194000C47603 /* Landmarks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Landmarks.app; sourceTree = BUILT_PRODUCTS_DIR; };
B7394865229F194000C47603 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
B7394867229F194000C47603 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
B7394869229F194000C47603 /* LandmarkDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LandmarkDetail.swift; sourceTree = "<group>"; };
B739486B229F194200C47603 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
B739486E229F194200C47603 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
B7394871229F194200C47603 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
B7394873229F194200C47603 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
B7394879229F1B3F00C47603 /* CircleImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleImage.swift; sourceTree = "<group>"; };
B739487B229F1B6800C47603 /* MapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView.swift; sourceTree = "<group>"; };
B739487F229F28B900C47603 /* Landmark.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Landmark.swift; sourceTree = "<group>"; };
B7394880229F28B900C47603 /* Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = "<group>"; };
B7394884229F292D00C47603 /* rainbowlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = rainbowlake.jpg; sourceTree = "<group>"; };
B7394886229F292E00C47603 /* icybay.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = icybay.jpg; sourceTree = "<group>"; };
B7394887229F292E00C47603 /* lakemcdonald.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = lakemcdonald.jpg; sourceTree = "<group>"; };
B7394888229F292E00C47603 /* turtlerock.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = turtlerock.jpg; sourceTree = "<group>"; };
B7394889229F292E00C47603 /* umbagog.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = umbagog.jpg; sourceTree = "<group>"; };
B739488A229F292E00C47603 /* hiddenlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = hiddenlake.jpg; sourceTree = "<group>"; };
B739488B229F292E00C47603 /* stmarylake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = stmarylake.jpg; sourceTree = "<group>"; };
B739488C229F292E00C47603 /* twinlake.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = twinlake.jpg; sourceTree = "<group>"; };
B739488D229F292E00C47603 /* silversalmoncreek.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = silversalmoncreek.jpg; sourceTree = "<group>"; };
B739488E229F292E00C47603 /* landmarkData.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = landmarkData.json; sourceTree = "<group>"; };
B739488F229F292F00C47603 /* chincoteague.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = chincoteague.jpg; sourceTree = "<group>"; };
B7394890229F292F00C47603 /* chilkoottrail.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = chilkoottrail.jpg; sourceTree = "<group>"; };
B739489E229F2D9700C47603 /* LandmarkRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LandmarkRow.swift; path = "Supporting Views/LandmarkRow.swift"; sourceTree = "<group>"; };
B73948A0229F2E1F00C47603 /* LandmarkList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LandmarkList.swift; sourceTree = "<group>"; };
B73948A2229F3E2200C47603 /* charleyrivers.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = charleyrivers.jpg; sourceTree = "<group>"; };
B7D2AAC4229F4D7C0061E5F5 /* UserData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserData.swift; sourceTree = "<group>"; };
B7D587AD229F7382006E8DCF /* BadgeBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeBackground.swift; sourceTree = "<group>"; };
B7D587AF229F73C1006E8DCF /* BadgeSymbol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeSymbol.swift; sourceTree = "<group>"; };
B7D587B1229F7406006E8DCF /* RotatedBadgeSymbol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RotatedBadgeSymbol.swift; sourceTree = "<group>"; };
B7D587B5229F825D006E8DCF /* HikeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HikeView.swift; sourceTree = "<group>"; };
B7D587B7229F826D006E8DCF /* GraphCapsule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphCapsule.swift; sourceTree = "<group>"; };
B7D587B9229F8288006E8DCF /* Hike.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Hike.swift; sourceTree = "<group>"; };
B7D587BB229F82EB006E8DCF /* HikeDetail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HikeDetail.swift; sourceTree = "<group>"; };
B7D587BD229F82FF006E8DCF /* HikeGraph.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HikeGraph.swift; sourceTree = "<group>"; };
B7D587BF229F830B006E8DCF /* hikeData.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = hikeData.json; sourceTree = "<group>"; };
C4E4AAA0C4E4035000000001 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
D4647A20D46497F000000001 /* SampleCode.xcconfig */ = {isa = PBXFileReference; name = SampleCode.xcconfig; path = ../Configuration/SampleCode.xcconfig; sourceTree = "<group>"; };
D4689770D468771000000001 /* LICENSE.txt */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE.txt; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
B739485F229F194000C47603 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
B7394859229F194000C47603 = {
isa = PBXGroup;
children = (
C4E4AAA0C4E4035000000001 /* README.md */,
B7394864229F194000C47603 /* Landmarks */,
B7394863229F194000C47603 /* Products */,
D46430F0D464341000000001 /* Configuration */,
D6574180D65753B000000001 /* LICENSE */,
);
sourceTree = "<group>";
};
B7394863229F194000C47603 /* Products */ = {
isa = PBXGroup;
children = (
B7394862229F194000C47603 /* Landmarks.app */,
);
name = Products;
sourceTree = "<group>";
};
B7394864229F194000C47603 /* Landmarks */ = {
isa = PBXGroup;
children = (
B739487E229F282200C47603 /* Models */,
B7394865229F194000C47603 /* AppDelegate.swift */,
B7394867229F194000C47603 /* SceneDelegate.swift */,
B73948A0229F2E1F00C47603 /* LandmarkList.swift */,
B739489E229F2D9700C47603 /* LandmarkRow.swift */,
B7394869229F194000C47603 /* LandmarkDetail.swift */,
B7D587B5229F825D006E8DCF /* HikeView.swift */,
B7D587BB229F82EB006E8DCF /* HikeDetail.swift */,
B7310DD0229F6839001079B9 /* HexagonParameters.swift */,
B739487D229F1C0100C47603 /* Supporting Views */,
B7394883229F291A00C47603 /* Resources */,
B739486B229F194200C47603 /* Assets.xcassets */,
B7394870229F194200C47603 /* LaunchScreen.storyboard */,
B7394873229F194200C47603 /* Info.plist */,
B739486D229F194200C47603 /* Preview Content */,
);
path = Landmarks;
sourceTree = "<group>";
};
B739486D229F194200C47603 /* Preview Content */ = {
isa = PBXGroup;
children = (
B739486E229F194200C47603 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
B739487D229F1C0100C47603 /* Supporting Views */ = {
isa = PBXGroup;
children = (
B7394879229F1B3F00C47603 /* CircleImage.swift */,
B739487B229F1B6800C47603 /* MapView.swift */,
B7310DD2229F6CA9001079B9 /* Badge.swift */,
B7D587AF229F73C1006E8DCF /* BadgeSymbol.swift */,
B7D587B1229F7406006E8DCF /* RotatedBadgeSymbol.swift */,
B7D587AD229F7382006E8DCF /* BadgeBackground.swift */,
B7D587BD229F82FF006E8DCF /* HikeGraph.swift */,
B7D587B7229F826D006E8DCF /* GraphCapsule.swift */,
);
path = "Supporting Views";
sourceTree = "<group>";
};
B739487E229F282200C47603 /* Models */ = {
isa = PBXGroup;
children = (
B7394880229F28B900C47603 /* Data.swift */,
B739487F229F28B900C47603 /* Landmark.swift */,
B7D587B9229F8288006E8DCF /* Hike.swift */,
B7D2AAC4229F4D7C0061E5F5 /* UserData.swift */,
);
path = Models;
sourceTree = "<group>";
};
B7394883229F291A00C47603 /* Resources */ = {
isa = PBXGroup;
children = (
B739488E229F292E00C47603 /* landmarkData.json */,
B7D587BF229F830B006E8DCF /* hikeData.json */,
B7394890229F292F00C47603 /* chilkoottrail.jpg */,
B739488F229F292F00C47603 /* chincoteague.jpg */,
B739488A229F292E00C47603 /* hiddenlake.jpg */,
B7394886229F292E00C47603 /* icybay.jpg */,
B7394887229F292E00C47603 /* lakemcdonald.jpg */,
B7394884229F292D00C47603 /* rainbowlake.jpg */,
B739488D229F292E00C47603 /* silversalmoncreek.jpg */,
B739488B229F292E00C47603 /* stmarylake.jpg */,
B7394888229F292E00C47603 /* turtlerock.jpg */,
B739488C229F292E00C47603 /* twinlake.jpg */,
B7394889229F292E00C47603 /* umbagog.jpg */,
B73948A2229F3E2200C47603 /* charleyrivers.jpg */,
);
path = Resources;
sourceTree = "<group>";
};
D46430F0D464341000000001 /* Configuration */ = {
isa = PBXGroup;
children = (
D4647A20D46497F000000001 /* SampleCode.xcconfig */,
);
name = Configuration;
sourceTree = "<group>";
};
D6574180D65753B000000001 /* LICENSE */ = {
isa = PBXGroup;
children = (
D4689770D468771000000001 /* LICENSE.txt */,
);
name = LICENSE;
path = ../LICENSE;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
B7394861229F194000C47603 /* Landmarks */ = {
isa = PBXNativeTarget;
buildConfigurationList = B7394876229F194200C47603 /* Build configuration list for PBXNativeTarget "Landmarks" */;
buildPhases = (
B739485E229F194000C47603 /* Sources */,
B739485F229F194000C47603 /* Frameworks */,
B7394860229F194000C47603 /* Resources */,
C602AC70C605937000000001,
);
buildRules = (
);
dependencies = (
);
name = Landmarks;
productName = Landmarks;
productReference = B7394862229F194000C47603 /* Landmarks.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
B739485A229F194000C47603 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1100;
LastUpgradeCheck = 1100;
ORGANIZATIONNAME = Apple;
TargetAttributes = {
B7394861229F194000C47603 = {
CreatedOnToolsVersion = 11.0;
};
};
};
buildConfigurationList = B739485D229F194000C47603 /* Build configuration list for PBXProject "AnimatingViewsAndTransitions" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = B7394859229F194000C47603;
productRefGroup = B7394863229F194000C47603 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
B7394861229F194000C47603 /* Landmarks */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
B7394860229F194000C47603 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B739489A229F292F00C47603 /* silversalmoncreek.jpg in Resources */,
B7394894229F292F00C47603 /* lakemcdonald.jpg in Resources */,
B7D587C0229F830B006E8DCF /* hikeData.json in Resources */,
B7394872229F194200C47603 /* LaunchScreen.storyboard in Resources */,
B73948A3229F3E2200C47603 /* charleyrivers.jpg in Resources */,
B7394891229F292F00C47603 /* rainbowlake.jpg in Resources */,
B739486F229F194200C47603 /* Preview Assets.xcassets in Resources */,
B7394895229F292F00C47603 /* turtlerock.jpg in Resources */,
B739486C229F194200C47603 /* Assets.xcassets in Resources */,
B7394899229F292F00C47603 /* twinlake.jpg in Resources */,
B7394896229F292F00C47603 /* umbagog.jpg in Resources */,
B739489D229F292F00C47603 /* chilkoottrail.jpg in Resources */,
B739489C229F292F00C47603 /* chincoteague.jpg in Resources */,
B739489B229F292F00C47603 /* landmarkData.json in Resources */,
B7394893229F292F00C47603 /* icybay.jpg in Resources */,
B7394897229F292F00C47603 /* hiddenlake.jpg in Resources */,
B7394898229F292F00C47603 /* stmarylake.jpg in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
B739485E229F194000C47603 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B7394882229F28B900C47603 /* Data.swift in Sources */,
B7310DD3229F6CA9001079B9 /* Badge.swift in Sources */,
B7394866229F194000C47603 /* AppDelegate.swift in Sources */,
B7D587B8229F826D006E8DCF /* GraphCapsule.swift in Sources */,
B739487A229F1B3F00C47603 /* CircleImage.swift in Sources */,
B739487C229F1B6800C47603 /* MapView.swift in Sources */,
B7D587BA229F8288006E8DCF /* Hike.swift in Sources */,
B7D587BC229F82EB006E8DCF /* HikeDetail.swift in Sources */,
B7D587B6229F825D006E8DCF /* HikeView.swift in Sources */,
B7310DD1229F6839001079B9 /* HexagonParameters.swift in Sources */,
B73948A1229F2E1F00C47603 /* LandmarkList.swift in Sources */,
B7D587B0229F73C1006E8DCF /* BadgeSymbol.swift in Sources */,
B7D587B2229F7406006E8DCF /* RotatedBadgeSymbol.swift in Sources */,
B7D587BE229F82FF006E8DCF /* HikeGraph.swift in Sources */,
B7394868229F194000C47603 /* SceneDelegate.swift in Sources */,
B7D587AE229F7382006E8DCF /* BadgeBackground.swift in Sources */,
B739486A229F194000C47603 /* LandmarkDetail.swift in Sources */,
B739489F229F2D9700C47603 /* LandmarkRow.swift in Sources */,
B7D2AAC5229F4D7C0061E5F5 /* UserData.swift in Sources */,
B7394881229F28B900C47603 /* Landmark.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
B7394870229F194200C47603 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
B7394871229F194200C47603 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
B7394874229F194200C47603 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D4647A20D46497F000000001 /* SampleCode.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
B7394875229F194200C47603 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D4647A20D46497F000000001 /* SampleCode.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
B7394877229F194200C47603 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D4647A20D46497F000000001 /* SampleCode.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "Landmarks/Preview\\ Content";
DEVELOPMENT_TEAM = "";
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Landmarks/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.Landmarks${SAMPLE_CODE_DISAMBIGUATOR}";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
B7394878229F194200C47603 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = D4647A20D46497F000000001 /* SampleCode.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "Landmarks/Preview\\ Content";
DEVELOPMENT_TEAM = "";
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Landmarks/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = "com.example.apple-samplecode.Landmarks${SAMPLE_CODE_DISAMBIGUATOR}";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
B739485D229F194000C47603 /* Build configuration list for PBXProject "AnimatingViewsAndTransitions" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B7394874229F194200C47603 /* Debug */,
B7394875229F194200C47603 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
B7394876229F194200C47603 /* Build configuration list for PBXNativeTarget "Landmarks" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B7394877229F194200C47603 /* Debug */,
B7394878229F194200C47603 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = B739485A229F194000C47603 /* Project object */;
}

8
Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/AnimatingViewsAndTransitions.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

@ -0,0 +1,8 @@
<?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>BuildSystemType</key>
<string>Latest</string>
</dict>
</plist>

36
Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/Landmarks/AppDelegate.swift

@ -0,0 +1,36 @@
/*
See LICENSE folder for this samples licensing information.
Abstract:
The application delegate.
*/
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
}

113
Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/Contents.json

@ -0,0 +1,113 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "landmark_app_icon_40x40.png",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "landmark_app_icon_58x58.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "landmark_app_icon_87x87.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "landmark_app_icon_80x80-1.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "landmark_app_icon_120x120-1.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "landmark_app_icon_120x120.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "landmark_app_icon_180x180.png",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "landmark_app_icon_40x40-2.png",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "landmark_app_icon_58x58-1.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "landmark_app_icon_40x40-1.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "landmark_app_icon_80x80.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "landmark_app_icon_76x76.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "landmark_app_icon_152x152.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "landmark_app_icon_167x167.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "landmark_app_icon_1024x1024.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_1024x1024.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
Other Projects/Animating Views And Transitions/StartingPoint/Landmarks/Landmarks/Assets.xcassets/AppIcon.appiconset/landmark_app_icon_120x120-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save