├── 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 | MIT Licance 14 | Release 15 | Swift 16 | Platform 17 | Twitter 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 | --------------------------------------------------------------------------------