├── KSliderCard.xcodeproj
├── xcuserdata
│ └── kenanatmaca.xcuserdatad
│ │ ├── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcuserdata
│ │ └── kenanatmaca.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── project.pbxproj
├── KSliderCard
├── Sources
│ ├── KSliderCardDataProvider.swift
│ ├── NotificationName+.swift
│ ├── KSliderCardItem.swift
│ ├── KSliderCardBackgroundView.swift
│ ├── KSliderCardOptions.swift
│ ├── KSliderCard.swift
│ └── KSliderCardView.swift
├── KSliderCard.h
└── Info.plist
├── KSliderCard.podspec
├── LICENSE
└── README.md
/KSliderCard.xcodeproj/xcuserdata/kenanatmaca.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/KSliderCard.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/KSliderCard.xcodeproj/project.xcworkspace/xcuserdata/kenanatmaca.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KenanAtmaca/KSliderCard/HEAD/KSliderCard.xcodeproj/project.xcworkspace/xcuserdata/kenanatmaca.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/KSliderCard.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/KSliderCard/Sources/KSliderCardDataProvider.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Created by Kenan Atmaca on 11.09.2019.
3 | // Copyright © 2019 Kenan Atmaca. All rights reserved.
4 | //
5 |
6 | import Foundation
7 |
8 | class KSliderCardDataProvider {
9 | public var cardsStack:[KSliderCardView] = []
10 | public var items:[KSliderCardItem] = []
11 | }
12 |
--------------------------------------------------------------------------------
/KSliderCard/Sources/NotificationName+.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Created by Kenan Atmaca on 11.09.2019.
3 | // Copyright © 2019 Kenan Atmaca. All rights reserved.
4 | //
5 |
6 | import Foundation
7 |
8 | extension Notification.Name {
9 | static let removeBackground = Notification.Name(rawValue: "KSliderCard_removeBackground")
10 | static let backCard = Notification.Name(rawValue: "KSliderCard_backCard")
11 | }
12 |
--------------------------------------------------------------------------------
/KSliderCard.xcodeproj/xcuserdata/kenanatmaca.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | KSliderCard.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/KSliderCard/Sources/KSliderCardItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Created by Kenan Atmaca on 11.09.2019.
3 | // Copyright © 2019 Kenan Atmaca. All rights reserved.
4 | //
5 |
6 | import UIKit
7 |
8 | public struct KSliderCardItem {
9 | public var image:UIImage?
10 | public var title:String?
11 | public var text:String?
12 |
13 | public init(image:UIImage?, title:String?, text:String?) {
14 | self.image = image
15 | self.title = title
16 | self.text = text
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/KSliderCard/KSliderCard.h:
--------------------------------------------------------------------------------
1 | //
2 | // KSliderCard.h
3 | // KSliderCard
4 | //
5 | // Created by Kenan Atmaca on 13.09.2019.
6 | // Copyright © 2019 Kenan Atmaca. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | //! Project version number for KSliderCard.
12 | FOUNDATION_EXPORT double KSliderCardVersionNumber;
13 |
14 | //! Project version string for KSliderCard.
15 | FOUNDATION_EXPORT const unsigned char KSliderCardVersionString[];
16 |
17 | // In this header, you should import all the public headers of your framework using statements like #import
18 |
19 |
20 |
--------------------------------------------------------------------------------
/KSliderCard/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | $(CURRENT_PROJECT_VERSION)
21 |
22 |
23 |
--------------------------------------------------------------------------------
/KSliderCard.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 |
3 | s.name = "KSliderCard"
4 | s.version = "1.0"
5 | s.summary = "Basic, animatable iOS slider card"
6 | s.description = <<-DESC
7 | Basic, animatable iOS slider card
8 | DESC
9 | s.homepage = "https://github.com/KenanAtmaca/KSliderCard"
10 | s.license = { :type => "MIT", :file => "LICENSE" }
11 | s.author = { "KenanAtmaca" => "mail.kenanatmaca@gmail.com" }
12 | s.social_media_url = "https://twitter.com/uikenan"
13 |
14 | s.platform = :ios, "11.0"
15 | s.requires_arc = true
16 | s.ios.deployment_target = "11.0"
17 |
18 | s.source = { :git => "https://github.com/KenanAtmaca/KSliderCard", :tag => "#{s.version}" }
19 | s.source_files = "KSliderCard", "KSliderCard/**/*.{h,m,swift}"
20 | s.swift_version = '4.2'
21 | s.pod_target_xcconfig = { 'SWIFT_VERSION' => '4.2'}
22 | end
23 |
--------------------------------------------------------------------------------
/KSliderCard/Sources/KSliderCardBackgroundView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Created by Kenan Atmaca on 11.09.2019.
3 | // Copyright © 2019 Kenan Atmaca. All rights reserved.
4 | //
5 |
6 | import UIKit
7 |
8 | class KSliderCardBackgroundView: UIView {
9 |
10 | var style:KSliderBackgroundStyle?
11 |
12 | func setup() -> UIView {
13 | self.frame = UIScreen.main.bounds
14 | if let backgroundStyle = style {
15 | switch (backgroundStyle) {
16 | case .dark: self.backgroundColor = UIColor.black.withAlphaComponent(0.8)
17 | case .light: self.backgroundColor = UIColor.white.withAlphaComponent(0.3)
18 | case .none: self.removeFromSuperview()
19 | }
20 | } else {
21 | self.backgroundColor = .clear
22 | }
23 | return self
24 | }
25 |
26 | func remove() {
27 | UIView.animate(withDuration: 0.3, animations: {
28 | self.alpha = 0
29 | }) { (_) in
30 | self.removeFromSuperview()
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/KSliderCard/Sources/KSliderCardOptions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Created by Kenan Atmaca on 11.09.2019.
3 | // Copyright © 2019 Kenan Atmaca. All rights reserved.
4 | //
5 |
6 | import UIKit
7 |
8 | public enum KSliderBackgroundStyle {
9 | case dark
10 | case light
11 | case none
12 | }
13 |
14 | public class KSliderCardOptions {
15 |
16 | public var titleColor:UIColor?
17 | public var titleFont:UIFont?
18 | public var textColor:UIColor?
19 | public var textFont:UIFont?
20 | public var isBlurImage:Bool = true
21 | public var isAnimation:Bool = true
22 | public var backgroundStyle:KSliderBackgroundStyle?
23 | public var blurStyle:KSliderBackgroundStyle?
24 | public var backAction:Bool = false
25 | public var backButtonTitle:String?
26 | public var backButtonImage:UIImage?
27 | public var backButtonBackgroundColor:UIColor?
28 | public var backButtonColor:UIColor?
29 | public var backButtonTextColor:UIColor?
30 | public var backButtonFont:UIFont?
31 | public var backButtonSize:CGSize?
32 | }
33 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Kenan Atmaca
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/KSliderCard/Sources/KSliderCard.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Created by Kenan Atmaca on 11.09.2019.
3 | // Copyright © 2019 Kenan Atmaca. All rights reserved.
4 | //
5 |
6 | import UIKit
7 |
8 | open class KSliderCard {
9 |
10 | private var backgroundView = KSliderCardBackgroundView()
11 | private var tmpCards:[KSliderCardView] = []
12 | private var data = KSliderCardDataProvider()
13 | private var rootView:UIView!
14 |
15 | public var options = KSliderCardOptions()
16 |
17 | public init() {
18 | setupObservers()
19 | }
20 |
21 | public convenience init (items: [KSliderCardItem]) {
22 | self.init()
23 | data.items = items
24 | }
25 |
26 | public func show(to view: UIView) {
27 | self.rootView = view
28 | backgroundView.style = options.backgroundStyle
29 | view.addSubview(backgroundView.setup())
30 | data.items = data.items.reversed()
31 |
32 | if data.items.count > 1 {
33 | (0..
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | ## Requirements
21 |
22 | - Xcode 9.0 +
23 | - iOS 11.0 or greater
24 |
25 | ## Installation
26 |
27 | ### CocoaPods
28 |
29 | 1. Install [CocoaPods](http://cocoapods.org)
30 | 2. Add this repo to your `Podfile`
31 |
32 | ```ruby
33 | platform :ios, '11.0'
34 |
35 | target 'ProjectName' do
36 | use_frameworks!
37 | pod 'KSliderCard'
38 | end
39 | ```
40 |
41 | 3. Run `pod install`
42 | 4. Open up the new `.xcworkspace` that CocoaPods generated
43 | 5. Whenever you want to use the library: `import KSliderCard`
44 |
45 | ### Manually
46 |
47 | 1. Simply download the `KSliderCard` source files and import them into your project.
48 |
49 | ## Usage
50 |
51 | ```Swift
52 | import UIKit
53 | import KSliderCard
54 |
55 | class ViewController: UIViewController {
56 |
57 | var sliderCard:KSliderCard!
58 |
59 | override func viewDidLoad() {
60 | super.viewDidLoad()
61 | showSliderCard()
62 | }
63 |
64 | func showSliderCard() {
65 | sliderCard = KSliderCard(items: [KSliderCardItem(image: UIImage(named: "img1"), title: "Hello 🎉", text: "..."),
66 | KSliderCardItem(image: UIImage(named: "img2"), title: "Hii", text: "..."),
67 | KSliderCardItem(image: UIImage(named: "img3"), title: "Heey", text: "...")])
68 | sliderCard.options.isBlurImage = false
69 | sliderCard.options.backgroundStyle = .dark
70 | sliderCard.options.backAction = true
71 | sliderCard.options.backButtonImage = UIImage(named: "back")
72 | sliderCard.options.backButtonSize = CGSize(width: 64, height: 64)
73 | sliderCard.options.backButtonBackgroundColor = .clear
74 | sliderCard.options.backButtonColor = .white
75 | sliderCard.show(to: self.view)
76 | }
77 | }
78 |
79 | ```
80 |
81 | ## Options
82 |
83 | ```Swift
84 | titleColor:UIColor?
85 | titleFont:UIFont?
86 | textColor:UIColor?
87 | textFont:UIFont?
88 | isBlurImage:Bool = true
89 | isAnimation:Bool = true
90 | backgroundStyle:KSliderBackgroundStyle? // .dark, .light
91 | blurStyle:KSliderBackgroundStyle? // .dark, .light
92 | backAction:Bool = false
93 | backButtonTitle:String?
94 | backButtonImage:UIImage?
95 | backButtonBackgroundColor:UIColor?
96 | backButtonColor:UIColor?
97 | backButtonTextColor:UIColor?
98 | backButtonFont:UIFont?
99 | backButtonSize:CGSize?
100 | ```
101 |
102 | ## License
103 | Usage is provided under the [MIT License](http://http//opensource.org/licenses/mit-license.php). See LICENSE for the full details.
104 |
--------------------------------------------------------------------------------
/KSliderCard/Sources/KSliderCardView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Created by Kenan Atmaca on 11.09.2019.
3 | // Copyright © 2019 Kenan Atmaca. All rights reserved.
4 | //
5 |
6 | import UIKit
7 |
8 | class KSliderCardView: UIView {
9 |
10 | private var contentView:UIView = {
11 | let view = UIView()
12 | view.layer.zPosition = 99
13 | view.backgroundColor = .black
14 | view.isUserInteractionEnabled = true
15 | view.layer.cornerRadius = 15
16 | view.translatesAutoresizingMaskIntoConstraints = false
17 | return view
18 | }()
19 |
20 | private var contentImageView: UIImageView = {
21 | let imgView = UIImageView()
22 | imgView.clipsToBounds = true
23 | imgView.layer.cornerRadius = 15
24 | imgView.contentMode = UIView.ContentMode.scaleAspectFill
25 | imgView.translatesAutoresizingMaskIntoConstraints = false
26 | return imgView
27 | }()
28 |
29 | private var titleLabel:UILabel = {
30 | let label = UILabel()
31 | label.numberOfLines = 0
32 | label.translatesAutoresizingMaskIntoConstraints = false
33 | return label
34 | }()
35 |
36 | private var commentTextView:UITextView = {
37 | let label = UITextView()
38 | label.backgroundColor = .clear
39 | label.isEditable = false
40 | label.isSelectable = false
41 | label.translatesAutoresizingMaskIntoConstraints = false
42 | return label
43 | }()
44 |
45 | private var backButton:UIButton = {
46 | let button = UIButton()
47 | button.layer.zPosition = 98
48 | button.layer.cornerRadius = 10
49 | button.translatesAutoresizingMaskIntoConstraints = false
50 | return button
51 | }()
52 |
53 | private var blurView:UIVisualEffectView!
54 | private var blurEffect:UIBlurEffect!
55 | private var labelsStack = UIStackView()
56 | private var panGesture:UIPanGestureRecognizer!
57 |
58 | private var contentWidth = NSLayoutConstraint()
59 | private var contentHeight = NSLayoutConstraint()
60 | private var contentBottom = NSLayoutConstraint()
61 | private var contentCenterY = NSLayoutConstraint()
62 |
63 | private var isToggleSize:Bool = false
64 | private var rotateDivisor:CGFloat = 0
65 | private var viewIndex:Int = 0
66 |
67 | var options = KSliderCardOptions()
68 | var data = KSliderCardDataProvider()
69 |
70 | func setup(index: Int) -> UIView {
71 | self.viewIndex = index
72 | self.setupElementsUI()
73 | self.frame = UIScreen.main.bounds
74 | rotateDivisor = (self.frame.width / 2) / 0.61
75 | panGesture = UIPanGestureRecognizer(target: self, action: #selector(panContentViewAction))
76 | contentView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapContentViewAction)))
77 | contentView.addGestureRecognizer(panGesture)
78 | self.addSubview(contentView)
79 | startOpenAnimation()
80 |
81 | contentWidth = contentView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.91)
82 | contentHeight = contentView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.55)
83 | contentWidth.isActive = true
84 | contentHeight.isActive = true
85 | contentView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
86 | contentCenterY = contentView.centerYAnchor.constraint(equalTo: self.centerYAnchor, constant: 0)
87 | contentCenterY.isActive = true
88 | contentBottom = contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor)
89 | contentBottom.isActive = false
90 |
91 | contentView.addSubview(contentImageView)
92 | contentImageView.widthAnchor.constraint(equalTo: contentView.widthAnchor, multiplier: 1.0).isActive = true
93 | contentImageView.heightAnchor.constraint(equalTo: contentView.heightAnchor, multiplier: 1.0).isActive = true
94 | contentImageView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
95 | contentImageView.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
96 |
97 | if options.isBlurImage {
98 | setupBlurView()
99 | blurView.topAnchor.constraint(equalTo: self.contentView.topAnchor).isActive = true
100 | blurView.leftAnchor.constraint(equalTo: self.contentView.leftAnchor).isActive = true
101 | blurView.rightAnchor.constraint(equalTo: self.contentView.rightAnchor).isActive = true
102 | blurView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor).isActive = true
103 | }
104 |
105 | contentView.addSubview(labelsStack)
106 | labelsStack.translatesAutoresizingMaskIntoConstraints = false
107 | labelsStack.alignment = .fill
108 | labelsStack.distribution = .fill
109 | labelsStack.axis = .vertical
110 | labelsStack.spacing = 10
111 | labelsStack.addArrangedSubview(titleLabel)
112 | labelsStack.addArrangedSubview(commentTextView)
113 |
114 | labelsStack.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 30).isActive = true
115 | labelsStack.leftAnchor.constraint(equalTo: self.contentView.leftAnchor, constant: 10).isActive = true
116 | labelsStack.rightAnchor.constraint(equalTo: self.contentView.rightAnchor, constant: -10).isActive = true
117 | labelsStack.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -10).isActive = true
118 |
119 | if options.backAction {
120 | self.addSubview(backButton)
121 | backButton.topAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 20).isActive = true
122 | backButton.centerXAnchor.constraint(equalTo: self.centerXAnchor, constant: 0).isActive = true
123 | backButton.widthAnchor.constraint(equalToConstant: options.backButtonSize?.width ?? 100).isActive = true
124 | backButton.heightAnchor.constraint(equalToConstant: options.backButtonSize?.height ?? 40).isActive = true
125 | }
126 |
127 | return self
128 | }
129 |
130 | private func setupElementsUI() {
131 | if data.items.count > 0 {
132 | contentImageView.image = data.items[viewIndex].image
133 | titleLabel.text = data.items[viewIndex].title
134 | commentTextView.text = data.items[viewIndex].text
135 | }
136 | titleLabel.font = options.titleFont ?? UIFont(name: "Futura-Bold", size: 30)
137 | commentTextView.font = options.textFont ?? UIFont(name: "Avenir-Medium", size: 17)
138 | titleLabel.textColor = options.titleColor ?? .white
139 | commentTextView.textColor = options.textColor ?? .white
140 | backButton.addTarget(self, action: #selector(tapBackButtonAction), for: .touchUpInside)
141 | backButton.titleLabel?.font = options.backButtonFont ?? UIFont(name: "Avenir-Medium", size: 17)
142 | backButton.setTitle(options.backButtonTitle ?? "BACK", for: .normal)
143 | backButton.setImage(options.backButtonImage, for: .normal)
144 | backButton.setTitleColor(options.backButtonTextColor ?? .white, for: .normal)
145 | backButton.backgroundColor = options.backButtonBackgroundColor ?? UIColor.gray
146 | backButton.tintColor = options.backButtonColor
147 | }
148 |
149 | private func startOpenAnimation() {
150 | guard options.isAnimation else { return }
151 | contentView.alpha = 0
152 | contentView.transform = CGAffineTransform.init(scaleX: 0.3, y: 0.3)
153 | UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.8, options: .curveEaseOut, animations: {
154 | self.contentView.alpha = 1
155 | self.contentView.transform = CGAffineTransform.identity
156 | }, completion: nil)
157 | }
158 |
159 | private func setupBlurView() {
160 | if let blurStyle = options.blurStyle {
161 | switch (blurStyle) {
162 | case .dark: blurEffect = UIBlurEffect(style: .dark)
163 | case .light: blurEffect = UIBlurEffect(style: .light)
164 | case .none: blurEffect = UIBlurEffect(style: .dark)
165 | }
166 | } else {
167 | blurEffect = UIBlurEffect(style: .dark)
168 | }
169 | blurView = UIVisualEffectView(effect: blurEffect)
170 | blurView.isUserInteractionEnabled = true
171 | blurView.clipsToBounds = true
172 | blurView.layer.cornerRadius = 15
173 | blurView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
174 | blurView.translatesAutoresizingMaskIntoConstraints = false
175 | contentView.addSubview(blurView)
176 | }
177 |
178 | @objc private func panContentViewAction(gesture: UIPanGestureRecognizer) {
179 | let translation = gesture.translation(in: self)
180 | let percent = translation.x / self.bounds.size.width
181 | let xFromCenter = contentView.center.x - self.center.x
182 | let alphaPercent = 1 - abs(xFromCenter * 0.01) / 5
183 |
184 | self.contentView.center = CGPoint(x: self.center.x + translation.x, y: self.center.y + translation.y)
185 | self.contentView.transform = CGAffineTransform.init(rotationAngle: xFromCenter / rotateDivisor)
186 | if alphaPercent >= 0.7 { self.contentView.alpha = alphaPercent }
187 |
188 | if gesture.state == .ended {
189 | if abs(percent) >= 0.51 { removeCard() }
190 | UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.8, options: .curveEaseInOut, animations: {
191 | self.contentView.center = self.center
192 | self.contentView.transform = CGAffineTransform.identity
193 | self.contentView.alpha = 1
194 | }, completion: nil)
195 | }
196 | }
197 |
198 | private func removeCard() {
199 | guard self.data.cardsStack.indices.contains(self.viewIndex) else { return }
200 | let cardView = self.data.cardsStack[self.viewIndex]
201 | self.removeFromSuperview()
202 | if data.cardsStack.count > 1 {
203 | if options.isAnimation {
204 | UIView.animate(withDuration: 0.5, animations: {
205 | cardView.transform = CGAffineTransform.init(scaleX: 1.01, y: 1.01)
206 | }) { (_) in
207 | UIView.animate(withDuration: 0.5, animations: {
208 | cardView.transform = CGAffineTransform.identity
209 | })
210 | }
211 | }
212 | self.data.cardsStack.remove(at: self.viewIndex)
213 | } else {
214 | self.data.cardsStack.remove(at: self.viewIndex)
215 | NotificationCenter.default.post(name: Notification.Name.removeBackground, object: nil)
216 | }
217 | }
218 |
219 | @objc private func tapContentViewAction() {
220 | isToggleSize.toggle()
221 | if isToggleSize {
222 | self.panGesture.isEnabled = false
223 | self.contentWidth.isActive = false
224 | self.contentHeight.isActive = false
225 | self.contentCenterY.isActive = false
226 | UIView.animate(withDuration: 0.7, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0.8, options: [.curveEaseIn], animations: {
227 | self.contentWidth = self.contentView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 1)
228 | self.contentHeight = self.contentView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.95)
229 | self.contentWidth.isActive = true
230 | self.contentHeight.isActive = true
231 | self.contentBottom.isActive = true
232 | if self.options.isBlurImage { self.blurView.layer.cornerRadius = 0 }
233 | self.layoutIfNeeded()
234 | }, completion: nil)
235 | } else {
236 | self.panGesture.isEnabled = true
237 | self.contentWidth.isActive = false
238 | self.contentHeight.isActive = false
239 | self.contentBottom.isActive = false
240 | UIView.animate(withDuration: 0.7, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.8, options: [.curveEaseOut], animations: {
241 | self.contentWidth = self.contentView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.91)
242 | self.contentHeight = self.contentView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.55)
243 | self.contentWidth.isActive = true
244 | self.contentHeight.isActive = true
245 | self.contentCenterY.isActive = true
246 | if self.options.isBlurImage { self.blurView.layer.cornerRadius = 15 }
247 | self.layoutIfNeeded()
248 | }) { (_) in
249 | self.commentTextView.setContentOffset(.zero, animated: false)
250 | }
251 | }
252 | }
253 |
254 | @objc private func tapBackButtonAction() {
255 | NotificationCenter.default.post(name: .backCard, object: nil)
256 | }
257 |
258 | deinit {
259 | NotificationCenter.default.removeObserver(self)
260 | }
261 | }
262 |
--------------------------------------------------------------------------------
/KSliderCard.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 8A6F1126232CE456007843E1 /* KSliderCardDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A6F1125232CE456007843E1 /* KSliderCardDataProvider.swift */; };
11 | 8A77DACC232B919D00203E27 /* KSliderCard.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A77DACA232B919D00203E27 /* KSliderCard.h */; settings = {ATTRIBUTES = (Public, ); }; };
12 | 8A77DAD8232BA08E00203E27 /* KSliderCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A77DAD2232BA08E00203E27 /* KSliderCard.swift */; };
13 | 8A77DAD9232BA08E00203E27 /* KSliderCardOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A77DAD3232BA08E00203E27 /* KSliderCardOptions.swift */; };
14 | 8A77DADA232BA08E00203E27 /* KSliderCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A77DAD4232BA08E00203E27 /* KSliderCardView.swift */; };
15 | 8A77DADB232BA08E00203E27 /* NotificationName+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A77DAD5232BA08E00203E27 /* NotificationName+.swift */; };
16 | 8A77DADC232BA08E00203E27 /* KSliderCardBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A77DAD6232BA08E00203E27 /* KSliderCardBackgroundView.swift */; };
17 | 8A77DADD232BA08E00203E27 /* KSliderCardItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A77DAD7232BA08E00203E27 /* KSliderCardItem.swift */; };
18 | /* End PBXBuildFile section */
19 |
20 | /* Begin PBXFileReference section */
21 | 8A6F1125232CE456007843E1 /* KSliderCardDataProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KSliderCardDataProvider.swift; sourceTree = ""; };
22 | 8A77DAC7232B919D00203E27 /* KSliderCard.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KSliderCard.framework; sourceTree = BUILT_PRODUCTS_DIR; };
23 | 8A77DACA232B919D00203E27 /* KSliderCard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KSliderCard.h; sourceTree = ""; };
24 | 8A77DACB232B919D00203E27 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
25 | 8A77DAD2232BA08E00203E27 /* KSliderCard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KSliderCard.swift; sourceTree = ""; };
26 | 8A77DAD3232BA08E00203E27 /* KSliderCardOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KSliderCardOptions.swift; sourceTree = ""; };
27 | 8A77DAD4232BA08E00203E27 /* KSliderCardView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KSliderCardView.swift; sourceTree = ""; };
28 | 8A77DAD5232BA08E00203E27 /* NotificationName+.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NotificationName+.swift"; sourceTree = ""; };
29 | 8A77DAD6232BA08E00203E27 /* KSliderCardBackgroundView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KSliderCardBackgroundView.swift; sourceTree = ""; };
30 | 8A77DAD7232BA08E00203E27 /* KSliderCardItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KSliderCardItem.swift; sourceTree = ""; };
31 | /* End PBXFileReference section */
32 |
33 | /* Begin PBXFrameworksBuildPhase section */
34 | 8A77DAC4232B919D00203E27 /* Frameworks */ = {
35 | isa = PBXFrameworksBuildPhase;
36 | buildActionMask = 2147483647;
37 | files = (
38 | );
39 | runOnlyForDeploymentPostprocessing = 0;
40 | };
41 | /* End PBXFrameworksBuildPhase section */
42 |
43 | /* Begin PBXGroup section */
44 | 8A77DABD232B919D00203E27 = {
45 | isa = PBXGroup;
46 | children = (
47 | 8A77DAC9232B919D00203E27 /* KSliderCard */,
48 | 8A77DAC8232B919D00203E27 /* Products */,
49 | );
50 | sourceTree = "";
51 | };
52 | 8A77DAC8232B919D00203E27 /* Products */ = {
53 | isa = PBXGroup;
54 | children = (
55 | 8A77DAC7232B919D00203E27 /* KSliderCard.framework */,
56 | );
57 | name = Products;
58 | sourceTree = "";
59 | };
60 | 8A77DAC9232B919D00203E27 /* KSliderCard */ = {
61 | isa = PBXGroup;
62 | children = (
63 | 8A77DACA232B919D00203E27 /* KSliderCard.h */,
64 | 8A77DADE232BA0AE00203E27 /* Sources */,
65 | 8A77DACB232B919D00203E27 /* Info.plist */,
66 | );
67 | path = KSliderCard;
68 | sourceTree = "";
69 | };
70 | 8A77DADE232BA0AE00203E27 /* Sources */ = {
71 | isa = PBXGroup;
72 | children = (
73 | 8A77DAD2232BA08E00203E27 /* KSliderCard.swift */,
74 | 8A77DAD6232BA08E00203E27 /* KSliderCardBackgroundView.swift */,
75 | 8A77DAD7232BA08E00203E27 /* KSliderCardItem.swift */,
76 | 8A77DAD3232BA08E00203E27 /* KSliderCardOptions.swift */,
77 | 8A6F1125232CE456007843E1 /* KSliderCardDataProvider.swift */,
78 | 8A77DAD4232BA08E00203E27 /* KSliderCardView.swift */,
79 | 8A77DAD5232BA08E00203E27 /* NotificationName+.swift */,
80 | );
81 | path = Sources;
82 | sourceTree = "";
83 | };
84 | /* End PBXGroup section */
85 |
86 | /* Begin PBXHeadersBuildPhase section */
87 | 8A77DAC2232B919D00203E27 /* Headers */ = {
88 | isa = PBXHeadersBuildPhase;
89 | buildActionMask = 2147483647;
90 | files = (
91 | 8A77DACC232B919D00203E27 /* KSliderCard.h in Headers */,
92 | );
93 | runOnlyForDeploymentPostprocessing = 0;
94 | };
95 | /* End PBXHeadersBuildPhase section */
96 |
97 | /* Begin PBXNativeTarget section */
98 | 8A77DAC6232B919D00203E27 /* KSliderCard */ = {
99 | isa = PBXNativeTarget;
100 | buildConfigurationList = 8A77DACF232B919D00203E27 /* Build configuration list for PBXNativeTarget "KSliderCard" */;
101 | buildPhases = (
102 | 8A77DAC2232B919D00203E27 /* Headers */,
103 | 8A77DAC3232B919D00203E27 /* Sources */,
104 | 8A77DAC4232B919D00203E27 /* Frameworks */,
105 | 8A77DAC5232B919D00203E27 /* Resources */,
106 | );
107 | buildRules = (
108 | );
109 | dependencies = (
110 | );
111 | name = KSliderCard;
112 | productName = KSliderCard;
113 | productReference = 8A77DAC7232B919D00203E27 /* KSliderCard.framework */;
114 | productType = "com.apple.product-type.framework";
115 | };
116 | /* End PBXNativeTarget section */
117 |
118 | /* Begin PBXProject section */
119 | 8A77DABE232B919D00203E27 /* Project object */ = {
120 | isa = PBXProject;
121 | attributes = {
122 | LastUpgradeCheck = 1030;
123 | ORGANIZATIONNAME = "Kenan Atmaca";
124 | TargetAttributes = {
125 | 8A77DAC6232B919D00203E27 = {
126 | CreatedOnToolsVersion = 10.3;
127 | LastSwiftMigration = 1030;
128 | };
129 | };
130 | };
131 | buildConfigurationList = 8A77DAC1232B919D00203E27 /* Build configuration list for PBXProject "KSliderCard" */;
132 | compatibilityVersion = "Xcode 9.3";
133 | developmentRegion = en;
134 | hasScannedForEncodings = 0;
135 | knownRegions = (
136 | en,
137 | );
138 | mainGroup = 8A77DABD232B919D00203E27;
139 | productRefGroup = 8A77DAC8232B919D00203E27 /* Products */;
140 | projectDirPath = "";
141 | projectRoot = "";
142 | targets = (
143 | 8A77DAC6232B919D00203E27 /* KSliderCard */,
144 | );
145 | };
146 | /* End PBXProject section */
147 |
148 | /* Begin PBXResourcesBuildPhase section */
149 | 8A77DAC5232B919D00203E27 /* Resources */ = {
150 | isa = PBXResourcesBuildPhase;
151 | buildActionMask = 2147483647;
152 | files = (
153 | );
154 | runOnlyForDeploymentPostprocessing = 0;
155 | };
156 | /* End PBXResourcesBuildPhase section */
157 |
158 | /* Begin PBXSourcesBuildPhase section */
159 | 8A77DAC3232B919D00203E27 /* Sources */ = {
160 | isa = PBXSourcesBuildPhase;
161 | buildActionMask = 2147483647;
162 | files = (
163 | 8A6F1126232CE456007843E1 /* KSliderCardDataProvider.swift in Sources */,
164 | 8A77DAD8232BA08E00203E27 /* KSliderCard.swift in Sources */,
165 | 8A77DADC232BA08E00203E27 /* KSliderCardBackgroundView.swift in Sources */,
166 | 8A77DADB232BA08E00203E27 /* NotificationName+.swift in Sources */,
167 | 8A77DADD232BA08E00203E27 /* KSliderCardItem.swift in Sources */,
168 | 8A77DADA232BA08E00203E27 /* KSliderCardView.swift in Sources */,
169 | 8A77DAD9232BA08E00203E27 /* KSliderCardOptions.swift in Sources */,
170 | );
171 | runOnlyForDeploymentPostprocessing = 0;
172 | };
173 | /* End PBXSourcesBuildPhase section */
174 |
175 | /* Begin XCBuildConfiguration section */
176 | 8A77DACD232B919D00203E27 /* Debug */ = {
177 | isa = XCBuildConfiguration;
178 | buildSettings = {
179 | ALWAYS_SEARCH_USER_PATHS = NO;
180 | CLANG_ANALYZER_NONNULL = YES;
181 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
182 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
183 | CLANG_CXX_LIBRARY = "libc++";
184 | CLANG_ENABLE_MODULES = YES;
185 | CLANG_ENABLE_OBJC_ARC = YES;
186 | CLANG_ENABLE_OBJC_WEAK = YES;
187 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
188 | CLANG_WARN_BOOL_CONVERSION = YES;
189 | CLANG_WARN_COMMA = YES;
190 | CLANG_WARN_CONSTANT_CONVERSION = YES;
191 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
192 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
193 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
194 | CLANG_WARN_EMPTY_BODY = YES;
195 | CLANG_WARN_ENUM_CONVERSION = YES;
196 | CLANG_WARN_INFINITE_RECURSION = YES;
197 | CLANG_WARN_INT_CONVERSION = YES;
198 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
199 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
200 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
201 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
202 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
203 | CLANG_WARN_STRICT_PROTOTYPES = YES;
204 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
205 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
206 | CLANG_WARN_UNREACHABLE_CODE = YES;
207 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
208 | CODE_SIGN_IDENTITY = "iPhone Developer";
209 | COPY_PHASE_STRIP = NO;
210 | CURRENT_PROJECT_VERSION = 1;
211 | DEBUG_INFORMATION_FORMAT = dwarf;
212 | ENABLE_STRICT_OBJC_MSGSEND = YES;
213 | ENABLE_TESTABILITY = YES;
214 | GCC_C_LANGUAGE_STANDARD = gnu11;
215 | GCC_DYNAMIC_NO_PIC = NO;
216 | GCC_NO_COMMON_BLOCKS = YES;
217 | GCC_OPTIMIZATION_LEVEL = 0;
218 | GCC_PREPROCESSOR_DEFINITIONS = (
219 | "DEBUG=1",
220 | "$(inherited)",
221 | );
222 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
223 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
224 | GCC_WARN_UNDECLARED_SELECTOR = YES;
225 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
226 | GCC_WARN_UNUSED_FUNCTION = YES;
227 | GCC_WARN_UNUSED_VARIABLE = YES;
228 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
229 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
230 | MTL_FAST_MATH = YES;
231 | ONLY_ACTIVE_ARCH = YES;
232 | SDKROOT = iphoneos;
233 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
234 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
235 | VERSIONING_SYSTEM = "apple-generic";
236 | VERSION_INFO_PREFIX = "";
237 | };
238 | name = Debug;
239 | };
240 | 8A77DACE232B919D00203E27 /* Release */ = {
241 | isa = XCBuildConfiguration;
242 | buildSettings = {
243 | ALWAYS_SEARCH_USER_PATHS = NO;
244 | CLANG_ANALYZER_NONNULL = YES;
245 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
246 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
247 | CLANG_CXX_LIBRARY = "libc++";
248 | CLANG_ENABLE_MODULES = YES;
249 | CLANG_ENABLE_OBJC_ARC = YES;
250 | CLANG_ENABLE_OBJC_WEAK = YES;
251 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
252 | CLANG_WARN_BOOL_CONVERSION = YES;
253 | CLANG_WARN_COMMA = YES;
254 | CLANG_WARN_CONSTANT_CONVERSION = YES;
255 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
256 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
257 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
258 | CLANG_WARN_EMPTY_BODY = YES;
259 | CLANG_WARN_ENUM_CONVERSION = YES;
260 | CLANG_WARN_INFINITE_RECURSION = YES;
261 | CLANG_WARN_INT_CONVERSION = YES;
262 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
263 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
264 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
265 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
266 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
267 | CLANG_WARN_STRICT_PROTOTYPES = YES;
268 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
269 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
270 | CLANG_WARN_UNREACHABLE_CODE = YES;
271 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
272 | CODE_SIGN_IDENTITY = "iPhone Developer";
273 | COPY_PHASE_STRIP = NO;
274 | CURRENT_PROJECT_VERSION = 1;
275 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
276 | ENABLE_NS_ASSERTIONS = NO;
277 | ENABLE_STRICT_OBJC_MSGSEND = YES;
278 | GCC_C_LANGUAGE_STANDARD = gnu11;
279 | GCC_NO_COMMON_BLOCKS = YES;
280 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
281 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
282 | GCC_WARN_UNDECLARED_SELECTOR = YES;
283 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
284 | GCC_WARN_UNUSED_FUNCTION = YES;
285 | GCC_WARN_UNUSED_VARIABLE = YES;
286 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
287 | MTL_ENABLE_DEBUG_INFO = NO;
288 | MTL_FAST_MATH = YES;
289 | SDKROOT = iphoneos;
290 | SWIFT_COMPILATION_MODE = wholemodule;
291 | SWIFT_OPTIMIZATION_LEVEL = "-O";
292 | VALIDATE_PRODUCT = YES;
293 | VERSIONING_SYSTEM = "apple-generic";
294 | VERSION_INFO_PREFIX = "";
295 | };
296 | name = Release;
297 | };
298 | 8A77DAD0232B919D00203E27 /* Debug */ = {
299 | isa = XCBuildConfiguration;
300 | buildSettings = {
301 | CLANG_ENABLE_MODULES = YES;
302 | CODE_SIGN_IDENTITY = "";
303 | CODE_SIGN_STYLE = Automatic;
304 | DEFINES_MODULE = YES;
305 | DEVELOPMENT_TEAM = 2B24WNBC56;
306 | DYLIB_COMPATIBILITY_VERSION = 1;
307 | DYLIB_CURRENT_VERSION = 1;
308 | DYLIB_INSTALL_NAME_BASE = "@rpath";
309 | INFOPLIST_FILE = KSliderCard/Info.plist;
310 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
311 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
312 | LD_RUNPATH_SEARCH_PATHS = (
313 | "$(inherited)",
314 | "@executable_path/Frameworks",
315 | "@loader_path/Frameworks",
316 | );
317 | PRODUCT_BUNDLE_IDENTIFIER = com.kenan.KSliderCard;
318 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
319 | SKIP_INSTALL = YES;
320 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
321 | SWIFT_VERSION = 5.0;
322 | TARGETED_DEVICE_FAMILY = "1,2";
323 | };
324 | name = Debug;
325 | };
326 | 8A77DAD1232B919D00203E27 /* Release */ = {
327 | isa = XCBuildConfiguration;
328 | buildSettings = {
329 | CLANG_ENABLE_MODULES = YES;
330 | CODE_SIGN_IDENTITY = "";
331 | CODE_SIGN_STYLE = Automatic;
332 | DEFINES_MODULE = YES;
333 | DEVELOPMENT_TEAM = 2B24WNBC56;
334 | DYLIB_COMPATIBILITY_VERSION = 1;
335 | DYLIB_CURRENT_VERSION = 1;
336 | DYLIB_INSTALL_NAME_BASE = "@rpath";
337 | INFOPLIST_FILE = KSliderCard/Info.plist;
338 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
339 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
340 | LD_RUNPATH_SEARCH_PATHS = (
341 | "$(inherited)",
342 | "@executable_path/Frameworks",
343 | "@loader_path/Frameworks",
344 | );
345 | PRODUCT_BUNDLE_IDENTIFIER = com.kenan.KSliderCard;
346 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
347 | SKIP_INSTALL = YES;
348 | SWIFT_VERSION = 5.0;
349 | TARGETED_DEVICE_FAMILY = "1,2";
350 | };
351 | name = Release;
352 | };
353 | /* End XCBuildConfiguration section */
354 |
355 | /* Begin XCConfigurationList section */
356 | 8A77DAC1232B919D00203E27 /* Build configuration list for PBXProject "KSliderCard" */ = {
357 | isa = XCConfigurationList;
358 | buildConfigurations = (
359 | 8A77DACD232B919D00203E27 /* Debug */,
360 | 8A77DACE232B919D00203E27 /* Release */,
361 | );
362 | defaultConfigurationIsVisible = 0;
363 | defaultConfigurationName = Release;
364 | };
365 | 8A77DACF232B919D00203E27 /* Build configuration list for PBXNativeTarget "KSliderCard" */ = {
366 | isa = XCConfigurationList;
367 | buildConfigurations = (
368 | 8A77DAD0232B919D00203E27 /* Debug */,
369 | 8A77DAD1232B919D00203E27 /* Release */,
370 | );
371 | defaultConfigurationIsVisible = 0;
372 | defaultConfigurationName = Release;
373 | };
374 | /* End XCConfigurationList section */
375 | };
376 | rootObject = 8A77DABE232B919D00203E27 /* Project object */;
377 | }
378 |
--------------------------------------------------------------------------------