diff --git a/Demo/UIOnboarding Demo SPM/UIOnboarding Demo SPM/UIOnboardingHelper.swift b/Demo/UIOnboarding Demo SPM/UIOnboarding Demo SPM/UIOnboardingHelper.swift index 32b814b..68549a9 100644 --- a/Demo/UIOnboarding Demo SPM/UIOnboarding Demo SPM/UIOnboardingHelper.swift +++ b/Demo/UIOnboarding Demo SPM/UIOnboarding Demo SPM/UIOnboardingHelper.swift @@ -27,6 +27,10 @@ struct UIOnboardingHelper { ]) } + static func setUpTagline() -> String { + "Know Every Rank" + } + static func setUpFeatures() -> Array { return .init([ .init(icon: .init(named: "feature-1")!, @@ -60,6 +64,7 @@ extension UIOnboardingViewConfiguration { return .init(appIcon: UIOnboardingHelper.setUpIcon(), firstTitleLine: UIOnboardingHelper.setUpFirstTitleLine(), secondTitleLine: UIOnboardingHelper.setUpSecondTitleLine(), + tagline: UIOnboardingHelper.setUpTagline(), features: UIOnboardingHelper.setUpFeatures(), textViewConfiguration: UIOnboardingHelper.setUpNotice(), buttonConfiguration: UIOnboardingHelper.setUpButton()) diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Configuration/UIOnboardingViewConfiguration.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Configuration/UIOnboardingViewConfiguration.swift index d09da65..c2c45b8 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Configuration/UIOnboardingViewConfiguration.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Configuration/UIOnboardingViewConfiguration.swift @@ -11,14 +11,18 @@ struct UIOnboardingViewConfiguration { var appIcon: UIImage var firstTitleLine: NSMutableAttributedString var secondTitleLine: NSMutableAttributedString + var tagline: String? = nil + var taglineColor: UIColor? = nil var features: Array let featureStyle: UIOnboardingFeatureStyle var textViewConfiguration: UIOnboardingTextViewConfiguration? = nil var buttonConfiguration: UIOnboardingButtonConfiguration - + init(appIcon: UIImage, firstTitleLine: NSMutableAttributedString, secondTitleLine: NSMutableAttributedString, + tagline: String? = nil, + taglineColor: UIColor? = nil, features: Array, featureStyle: UIOnboardingFeatureStyle = .init(), textViewConfiguration: UIOnboardingTextViewConfiguration? = nil, @@ -26,6 +30,8 @@ struct UIOnboardingViewConfiguration { self.appIcon = appIcon self.firstTitleLine = firstTitleLine self.secondTitleLine = secondTitleLine + self.tagline = tagline + self.taglineColor = taglineColor self.features = features self.featureStyle = featureStyle self.textViewConfiguration = textViewConfiguration diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingStack.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingStack.swift index 1220d55..3709a8e 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingStack.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/Onboarding/Views/UIOnboardingStack.swift @@ -69,10 +69,31 @@ final class UIOnboardingStack: UIStackView { setCustomSpacing(26, after: onboardingIcon) addArrangedSubview(onboardingTitleLabelStack) - setCustomSpacing(traitCollection.horizontalSizeClass == .regular ? 40 : UIScreenType.setUpTitleSpacing(), after: onboardingTitleLabelStack) onboardingTitleLabelStack.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true onboardingTitleLabelStack.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true - + + let titleSpacing: CGFloat = traitCollection.horizontalSizeClass == .regular ? 40 : UIScreenType.setUpTitleSpacing() + if let taglineText = configuration.tagline { + setCustomSpacing(14, after: onboardingTitleLabelStack) + let taglineLabel = UILabel() + taglineLabel.text = taglineText + var taglineFont = UIFont.systemFont(ofSize: 20, weight: .medium) + if let italicDescriptor = taglineFont.fontDescriptor.withSymbolicTraits(.traitItalic) { + taglineFont = UIFont(descriptor: italicDescriptor, size: 20) + } + taglineLabel.font = taglineFont + taglineLabel.textColor = configuration.taglineColor ?? .secondaryLabel + taglineLabel.numberOfLines = 0 + taglineLabel.adjustsFontSizeToFitWidth = true + taglineLabel.minimumScaleFactor = 0.8 + addArrangedSubview(taglineLabel) + taglineLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true + taglineLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true + setCustomSpacing(titleSpacing, after: taglineLabel) + } else { + setCustomSpacing(titleSpacing, after: onboardingTitleLabelStack) + } + addArrangedSubview(featuresList) featuresList.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true featuresList.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true diff --git a/Demo/UIOnboarding Demo/UIOnboarding Demo/UIOnboardingHelper.swift b/Demo/UIOnboarding Demo/UIOnboarding Demo/UIOnboardingHelper.swift index 8364690..1785d6f 100644 --- a/Demo/UIOnboarding Demo/UIOnboarding Demo/UIOnboardingHelper.swift +++ b/Demo/UIOnboarding Demo/UIOnboarding Demo/UIOnboardingHelper.swift @@ -26,6 +26,10 @@ struct UIOnboardingHelper { ]) } + static func setUpTagline() -> String { + "Know Every Rank" + } + static func setUpFeatures() -> Array { .init([ .init(icon: .init(named: "feature-1"), @@ -59,6 +63,7 @@ extension UIOnboardingViewConfiguration { .init(appIcon: UIOnboardingHelper.setUpIcon(), firstTitleLine: UIOnboardingHelper.setUpFirstTitleLine(), secondTitleLine: UIOnboardingHelper.setUpSecondTitleLine(), + tagline: UIOnboardingHelper.setUpTagline(), features: UIOnboardingHelper.setUpFeatures(), textViewConfiguration: UIOnboardingHelper.setUpNotice(), buttonConfiguration: UIOnboardingHelper.setUpButton()) diff --git a/Demo/UIOnboarding SwiftUI/UIOnboarding SwiftUI/UIOnboardingHelper.swift b/Demo/UIOnboarding SwiftUI/UIOnboarding SwiftUI/UIOnboardingHelper.swift index 649bbab..c68898e 100644 --- a/Demo/UIOnboarding SwiftUI/UIOnboarding SwiftUI/UIOnboardingHelper.swift +++ b/Demo/UIOnboarding SwiftUI/UIOnboarding SwiftUI/UIOnboardingHelper.swift @@ -27,6 +27,10 @@ struct UIOnboardingHelper { ]) } + static func setUpTagline() -> String { + "Know Every Rank" + } + static func setUpFeatures() -> Array { return .init([ .init(icon: .init(named: "feature-1")!, @@ -60,6 +64,7 @@ extension UIOnboardingViewConfiguration { return .init(appIcon: UIOnboardingHelper.setUpIcon(), firstTitleLine: UIOnboardingHelper.setUpFirstTitleLine(), secondTitleLine: UIOnboardingHelper.setUpSecondTitleLine(), + tagline: UIOnboardingHelper.setUpTagline(), features: UIOnboardingHelper.setUpFeatures(), textViewConfiguration: UIOnboardingHelper.setUpNotice(), buttonConfiguration: UIOnboardingHelper.setUpButton()) diff --git a/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift b/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift index 927ef8f..5eeaa29 100644 --- a/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift +++ b/Sources/UIOnboarding/Configuration/UIOnboardingViewConfiguration.swift @@ -11,14 +11,18 @@ public struct UIOnboardingViewConfiguration { public var appIcon: UIImage public var firstTitleLine: NSMutableAttributedString public var secondTitleLine: NSMutableAttributedString + public var tagline: String? = nil + public var taglineColor: UIColor? = nil public var features: Array public let featureStyle: UIOnboardingFeatureStyle public var textViewConfiguration: UIOnboardingTextViewConfiguration? = nil public var buttonConfiguration: UIOnboardingButtonConfiguration - + public init(appIcon: UIImage, firstTitleLine: NSMutableAttributedString, secondTitleLine: NSMutableAttributedString, + tagline: String? = nil, + taglineColor: UIColor? = nil, features: Array, featureStyle: UIOnboardingFeatureStyle = .init(), textViewConfiguration: UIOnboardingTextViewConfiguration? = nil, @@ -26,6 +30,8 @@ public struct UIOnboardingViewConfiguration { self.appIcon = appIcon self.firstTitleLine = firstTitleLine self.secondTitleLine = secondTitleLine + self.tagline = tagline + self.taglineColor = taglineColor self.features = features self.featureStyle = featureStyle self.textViewConfiguration = textViewConfiguration diff --git a/Sources/UIOnboarding/Views/UIOnboardingStack.swift b/Sources/UIOnboarding/Views/UIOnboardingStack.swift index 4994e03..d787c8d 100644 --- a/Sources/UIOnboarding/Views/UIOnboardingStack.swift +++ b/Sources/UIOnboarding/Views/UIOnboardingStack.swift @@ -69,10 +69,31 @@ final class UIOnboardingStack: UIStackView { setCustomSpacing(26, after: onboardingIcon) addArrangedSubview(onboardingTitleLabelStack) - setCustomSpacing(traitCollection.horizontalSizeClass == .regular ? 40 : UIScreenType.setUpTitleSpacing(), after: onboardingTitleLabelStack) onboardingTitleLabelStack.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true onboardingTitleLabelStack.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true - + + let titleSpacing: CGFloat = traitCollection.horizontalSizeClass == .regular ? 40 : UIScreenType.setUpTitleSpacing() + if let taglineText = configuration.tagline { + setCustomSpacing(14, after: onboardingTitleLabelStack) + let taglineLabel = UILabel() + taglineLabel.text = taglineText + var taglineFont = UIFont.systemFont(ofSize: 20, weight: .medium) + if let italicDescriptor = taglineFont.fontDescriptor.withSymbolicTraits(.traitItalic) { + taglineFont = UIFont(descriptor: italicDescriptor, size: 20) + } + taglineLabel.font = taglineFont + taglineLabel.textColor = configuration.taglineColor ?? .secondaryLabel + taglineLabel.numberOfLines = 0 + taglineLabel.adjustsFontSizeToFitWidth = true + taglineLabel.minimumScaleFactor = 0.8 + addArrangedSubview(taglineLabel) + taglineLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true + taglineLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true + setCustomSpacing(titleSpacing, after: taglineLabel) + } else { + setCustomSpacing(titleSpacing, after: onboardingTitleLabelStack) + } + addArrangedSubview(featuresList) featuresList.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true featuresList.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true