目录

Mcrich23 Toolkit

This is a package that I made that has a bunch of qualities of life.

Requirements

  • iOS 14, macOS 10.16, tvOS 14, or watchOS 6.7
  • Swift 5.5+
  • Xcode 12.5+

Installation

The preferred way of installing Mcrich23 Toolkit is via the Swift Package Manager.

  1. In Xcode, open your project and navigate to File → Add Packages…
  2. Paste the repository URL (https://github.com/Mcrich23/Mcrich23-Toolkit) and click Next.
  3. For Rules, select Up To Next Minor Version (With base version set to 0.6.1).
  4. Click Finish.
  5. Check Mcrich23-Toolkit
  6. Click Add To Project

Table Of Contents

Requirements

Installation

SwiftUI Functions
  • contextMenu

  • CardView

  • ShareSheet

  • onRotate

  • getTopVC

  • topVC

  • onWillDissapear

  • ConvertedGlyphImage

  • openUrl

  • UIKit Functions
    Other

    SwiftUI Functions

    ScrollCapsuleMultiFilter

    Type:

    SwiftUI View

    Description:

    A nice multiple filter UI that horizontally scrolls

    Image:

    CapsuleMultiFilter Image

    Example:

     ScrollCapsuleMultiFilter(menuContent: .constant({ // Passes in the view for the plus button menu. Must use .constant() so that the view updates.
            VStack {
                ForEach(viewModel.filterOpt, id: \.self) { text in
                    if !viewModel.filter.contains(text) {
                        Button {
                            viewModel.filter.append(text)
                        } label: {
                            Text(text)
                        }
                    }
                }
            }}),
        opt: $viewModel.filterOpt, //Use an array that are the same options as in the menu
        selected: $viewModel.filter //An array of currently selected filters
    )

    AdaptiveCapsuleMultiFilter

    Type:

    SwiftUI View

    Description:

    A nice multiple filter UI that auto resizes

    Image:

    CapsuleMultiFilter Image

    Example:

    AdaptiveCapsuleMultiFilter(
        "Filter: ", // The label you want next to the capsule filters
        menuContent: .constant({ // Passes in the view for the plus button menu. Must use .constant() so that the view updates.
            VStack {
                ForEach(viewModel.filterOpt, id: \.self) { text in
                    if !viewModel.filter.contains(text) {
                        Button {
                            viewModel.filter.append(text)
                        } label: {
                            Text(text)
                        }
                    }
                }
            }}), opt: $viewModel.filterOpt, // Use an array that are the same options as in the menu selected:$viewModel.filter) // An array of currently selected filters

    OnboardingScreen

    Type:

    SwiftUI View

    Description:

    A screen for welcoming the user or presenting a What’s New screen.

    Image:

    OnboardingScreen Image (Individual) OnboardingScreen Image (Steps)

    Example:

    Individual:

    OnboardingScreen(
        titleIcon: .systemImage(named: "plus"), // An icon to go next to the title
        titleIconColor: .yellow, // Color for the icon next to the title
        title: "Hello World", // Title
        subtitle: "Lorem Ipsum", // Subtitle (leave blank for it to dissapear)
        cells: .individual([
            FeatureCell(
                image: .systemImage(named: "hand"), // An icon next to the cell
                imageColor: .red, // Color for the icon next to the cell
                title: "Title", // Title
                subtitle: "Subtitle" // Subtitle/Description (leave blank for it to dissapear)
            )
        ])
    )

    Steps:

    let steps = [ Text(NSLocalizedString("welcome title 1", comment: "")).font(.body),
                  Text(NSLocalizedString("welcome title 2", comment: "")).font(.body),
                  Text(NSLocalizedString("welcome title 3", comment: "")).font(.body),
                  Text(NSLocalizedString("welcome title 4", comment: "")).font(.body)]
    
    let indicationTypes = [
        StepperIndicationType
            .custom(CircledIconView(image: Image(systemName: "plus"), width: 50)),
            .custom(CircledIconView(image: Image(systemName: "hand.draw"), width: 50)),
            .custom(CircledIconView(image: Image(systemName: "hand.tap"), width: 50)),
            .custom(CircledIconView(image: Image(systemName: "eye"), width: 50))
    ]
    ...
    
    OnboardingScreen<Content>(
       titleIcon: .systemImage(named: "plus"), // An icon to go next to the title
       titleIconColor: .yellow, // Color for the icon next to the title
       title: "Hello World", // Title
       subtitle: "Lorem Ipsum", // Subtitle (leave blank for it to dissapear)
       cells:
           .steps(
               StepperViewOnboarding(
                   steps: steps, // All the steps for the onboarding
                   indicationTypes: indicationTypes, // What goes next to the step text
                   lineOptions: .custom(1, Colors.blue(.teal).rawValue) // All the different line options
               )
           )
    )

    See badrinathvm/StepperView for more info on the Steps function.

    SwiftUIAlert

    Type:

    Alert

    Description:

    Default alerts for SwiftUI

    Examples:

    show

    SwiftUIAlert.show(title: "Hello Word!", //Alert Title
                        message: "Lorem Ipsum", //Alert Message
                        preferredStyle: .alert, //Style (alert or action sheet)
                        actions: [UIAlertAction(title: "Done", //Action Title
                                                style: .default, //Action Style (default, destructive, dismiss)
                                                handler: {_ in}) //Handler for choosing that action
                        ]
    )

    textfieldShow

    SwiftUIAlert.textfieldShow(title: "Test", //Alert Title
                                message: "Hello World!", //Alert Message
                                preferredStyle: .alert, //Style (alert or action sheet)
                                textfield: AlertTextfield(text: $text, //Textfield Text
                                                            placeholder: "", //Textfield Placeholder
                                                            clearButtonMode: .whileEditing, //When to show clear butt(always, whileEditing, unlessEditing, or never)
                                                            enablesReturnKeyAutomatically: true, //Show return key keyboard
                                                            disableAutocorrection: false, //Disable Autocorrection?
                                                            autocapitalization: .sentences, //Autocapitalization (nonsentances, allCharacter, or words)
                                                            keyboardType: .default, //The type of keyboard
                                                            returnKeyType: .default, //Type of return key on keyboard
                                                            isSecureTextEntry: .no, //Is Secure Textfield? (.yes(UITextInputPassordRules) or .no)
                                                            dismissKeyboardOnReturn: true), //Dismiss keyboard on return?
                                actions: [UIAlertAction(title: "Done", style: .default)]
    )

    contextMenu

    Type:

    SwiftUI View Modifier

    Description:

    Uses UIKit elements to broaden the capabilities of context menus.

    Example

    Expand

    PreviewContextMenu(
           navigate: .expand, // Expands view
           destination: ContentView2(), // View to preview
           menu: {
               let openView = UIAction(title: "Open", image:       UIImage(systemName: "arrow.right")) { _ in // Item for menu
                   showView.toggle()
               }
               return UIMenu(
                   title: "", // Menu Title
                   children: [ // Menu Items
                       openView
                   ]
               )
           }
       )

    Custom

    .contextMenu(PreviewContextMenu(
           navigate: .custom({ // Dismisses view and lets you run custom function
               showView.toggle()
           }),
           destination: ContentView2(), // View to preview
           menu: {
               let openView = UIAction(title: "Open", image:       UIImage(systemName: "arrow.right")) { _ in // Item for menu
                   showView.toggle()
               }
               return UIMenu(
                   title: "", // Menu Title
                   children: [ // Menu Items
                       openView
                   ]
               )
           }
       )
    )

    CardView

    Type:

    SwiftUI View

    Description:

    Similar to the cards in the App Store.

    Image:

    CardViewOpenCard

    Example:

    CardView(
        showHeader: .yes( // Wheather header should be visible
            headerTitle: "Title", // Title on the header
            headerSubtitle: "Subtitle", // Subtitle on the header
            headerSubtitleLocation: .below // If Subtitle is above or below the Title
        ),
        cards: $cards, // All the cards in the view
        showCreateButton: .yes( // Wheather create button should be visible
            create: { // Action when create (Plus Button) is tapped
                showCreateTicket.toggle()
            }
        ),
        maxWidth: 428, // The maximum width for cards
        selectedCards: { // Action called on selection of a card
            print("Selected Card")
        },
        deselectedCards: { // Action called on deselection of a card
            print("Deselected Card")
        }
    )

    ShareSheet

    Type:

    ShareSheet

    Description:

    System ShareSheet for SwiftUI.

    Image:

    ShareSheet

    Example:

    Mcrich23_Toolkit.presentShareSheet(
        activityItems: ["Hello World"], // Items to share
        excludedActivityTypes: [] // Applications to exclude from share sheet
    )

    onRotate

    Type:

    SwiftUI View Modifier

    Description:

    Run code whenever the device rotates.

    Example:

    @State var orientation = UIDevice.current.orientation
    var body: some view {
        VStack {
            if orientation == .portrait {
                Text("Hello World")
            }
        }
        .onRotate { newOrientation in
            orientation = newOrientation // Updates the orientation variable
        }
    }

    getTopVC

    Type:

    Function

    Description:

    Get the top view controller to do a uikit function on the current view instead of the root view

    Example:

    Mcrich23-Toolkit.getTopVC { vc in
        vc.present(view, animated: true)
    }

    topVC

    Type:

    UIViewController

    Description:

    Get the top view controller to do a uikit function on the current view instead of the root view

    Example:

    Mcrich23_Toolkit.topVC.present {
        EmptyView()
    }

    onWillDissapear

    Type:

    SwiftUI View Modifier

    Description:

    Run code when the view will dissapear, but before it actually dissapears.

    Example:

    var body: some View {
        Text("This view has dissapeared\(viewModel.dissapearCount)times!")
        .onWillDissapear {
            viewModel.dissapearCount += 1
        }
    }

    ConvertedGlyphImage

    Type:

    SwiftUI Image

    Description:

    Converts GlyphImage into a SwiftUI Image

    Example:

    ConvertedGlyphImage(GlyphImage: $GlyphImage, defaultIcon: Image(systemName: "apps.iphone") { image in
        image
            .resizable()
            .aspectRatio(contentMode: .fit)
            .foregroundColor(.primary)
    }

    openUrl

    Type:

    Function

    Description

    Opens a url

    Example

    Mcrich23_Toolkit.openUrl(url: url)

    UIKit Functions

    InteracteractiveLinkLabel

    Type:

    UILabel

    Description

    Easily hyperlink your UILabel with this component of the Mcrich23-Toolkit

    Example:

    let label: InteractiveLinkLabel = {
        let label = InteractiveLinkLabel()
        
        let firstChunk = NSMutableAttributedString(string: "Hello, my name is Morris, you cancheck out my website", attributes: nil) // Just text
        let website = NSMutableAttributedString(string: "here",attributes:[NSAttributedString.Key.link: URL(string: "https://mcrich23.com")!]) //Hyperlinked word
        
        //Put it together
        let fullAttributtedText = NSMutableAttributedString()
        fullAttributtedText.append(firstChunk)
        fullAttributtedText.append(tos)
        
        label.attributedText = fullAttributtedText
        label.numberOfLines = 0
        label.sizeToFit()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.isUserInteractionEnabled = true
        label.customUrlHandler = { url in // Open url in a custom way, Note: you may need todeclare in viewDidLoad
            let safari = SFSafariViewController(url: url)
            self.present(safari, animated: true)
        }
        
        return label
    }()

    InteracteractiveLinkTextView

    Type:

    UITextView

    Description

    Easily hyperlink your UITextView with this component of the Mcrich23-Toolkit

    Example:

    let textView: InteractiveLinkLabel = {
        let textView = InteractiveLinkLabel()
        
        let firstChunk = NSMutableAttributedString(string: "Hello, my name is Morris, you cancheck out my website", attributes: nil) // Just text
        let website = NSMutableAttributedString(string: "here",attributes:[NSAttributedString.Key.link: URL(string: "https://mcrich23.com")!]) //Hyperlinked word
        
        //Put it together
        let fullAttributtedText = NSMutableAttributedString()
        fullAttributtedText.append(firstChunk)
        fullAttributtedText.append(tos)
        
        // Modifiers
        textView.attributedText = fullAttributtedText
        textView.numberOfLines = 0
        textView.sizeToFit()
        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.isUserInteractionEnabled = true
        textView.customUrlHandler = { url in // Open url in a custom way, Note: you may need todeclare in viewDidLoad
            let safari = SFSafariViewController(url: url)
            self.present(safari, animated: true)
        }
        
        return label
    }()

    Other

    GlyphImage

    Type:

    Enum

    Description:

    Different types of glyphs, whether it be icons, or images. one variable for all the types.

    Convert it to an image with ConvertedGlyphImage

    Cases

    GlyphImage.systemImage(named: "x.circle") // Uses SF Symbols
    GlyphImage.systemImage(named: "person1") // Uses Assets.xcassets
    GlyphImage.remoteImage(url: self.url) // Fetches from url and displays image
    GlyphImage.defaultIcon // The default icon that you specify

    NetworkMonitor

    Type:

    Class

    Description:

    Watch connection to the internet and use information to modify app behavior.

    Note: You must call startMonitoring in order for NetworkMonitor to start working.

    Usage:

    Start Monitoring: NetworkMonitor.shared.startMonitoring() (Call in AppDelagate)

    Stop Monitoring: NetworkMonitor.shared.stopMonitoring()

    Get Connection Type: NetworkMonitor.shared.connectionType (Unknown can mean disconnected)

    关于
    192.0 KB
    邀请码
      Gitlink(确实开源)
    • 加入我们
    • 官网邮箱:gitlink@ccf.org.cn
    • QQ群
    • QQ群
    • 公众号
    • 公众号

    版权所有:中国计算机学会技术支持:开源发展技术委员会
    京ICP备13000930号-9 京公网安备 11010802047560号