A super-charged version of MYIntroductionView for building custom app introductions and tutorials.

Overview

MYBlurIntroductionView

#####NOTICE: As of February 4th, Apple has begun to ban new app submissions using the common blurring method (UIToolbar hack) found in MYBlurIntroductionView. We will work toward a new solution, but unfortunately this library has removed the blurring functionality until a solution is found. Cheers.

Intro

A Controller Built With You In Mind

It's time for one introduction/tutorial view to end them all! MYBlurIntroductionView is a powerful platform to build introductions for your iPhone apps. Built on the MYIntroductionView core, MYBlurIntroductionView takes the first time user experience to the next level by providing a host of new features for building highly customized introductions.

Features Include

  • Brand new stock panels built for iOS 7
  • Optional overlay on background images
  • Add custom panels straight from .xib files
  • Subclass MYIntroductionPanel (the stock panel) for custom panels with access to new methods like
    • panelDidAppear
    • panelDidDisappear
    • enable/disable
  • Delegates methods for panel change and introduction finishing events
  • iOS 6 and 7 compatible for iPhone (iPad coming soon)
  • Localized Skip Button
  • Right-to-Left Language Support

What to Include

Manual Installation

MYBlurIntroductionView is dependent on the following files and frameworks

  • MYBlurIntroductionView.{h,m}
  • MYIntroductionPanel.{h,m}
  • Uses the QuartzCore framework
  • Requires ARC

CocoaPods

MYBlurIntroductionView is also available for installation through cocoapods by using the following command.

pod 'MYBlurIntroductionView'

For help setting up and maintaining dependencies using CocoaPods check out this link: http://cocoapods.org/

The Process

Creating an introduction view can basically be boiled down to these steps

  1. Create panels
  2. Create and MYIntroductionView
  3. Add MYIntroductionPanels to MYIntroductionView
  4. Show View

Creating Panels

Stock Panels

One goal for MYBlurIntroductionView is to make the creation of stock (or "non-custom") panels just as easy as with MYIntroductionView. That's why the basic interface hasn't changed one bit. All content is optional and rearranges nicely for you. bl

The main panel class is MYIntroductionPanel.{h,m}. It has many different custom init methods for rapid creation of stock panels. Here are a few samples, the first with a header, and the second without.

//Create stock panel with header
UIView *headerView = [[NSBundle mainBundle] loadNibNamed:@"TestHeader" owner:nil options:nil][0];

MYIntroductionPanel *panel1 = [[MYIntroductionPanel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) title:@"Welcome to MYBlurIntroductionView" description:@"MYBlurIntroductionView is a powerful platform for building app introductions and tutorials. Built on the MYIntroductionView core, this revamped version has been reengineered for beauty and greater developer control." image:[UIImage imageNamed:@"HeaderImage.png"] header:headerView];
    
//Create stock panel with image
MYIntroductionPanel *panel2 = [[MYIntroductionPanel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) title:@"Automated Stock Panels" description:@"Need a quick-and-dirty solution for your app introduction? MYBlurIntroductionView comes with customizable stock panels that make writing an introduction a walk in the park. Stock panels come with optional overlay on background images. A full panel is just one method away!" image:[UIImage imageNamed:@"ForkImage.png"]];

And here are the end results

Panel1 Panel2

Custom Panels from .xib Files

One of the great things about MYBlurIntroductionView is that you can create the panels for your introduction directly from xib files. These are great for static layouts that do not need any interaction (think text and images).

Creating a custom panel is as easy as using the initWithFrame:nibNamed: for MYIntroductionPanel.

//Create Panel From Nib
MYIntroductionPanel *panel3 = [[MYIntroductionPanel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) nibNamed:@"TestPanel3"];

This will attach the xib file to a MYIntroductionPanel so it may be used in the introduction view. If you would like to use the stock title/description/header/image and their animations, simply set the desired additional attributes after the instantiation of a panel, and run the buildPanelWithFrame: method. An example can be seen below.

//Instantiate panel
MYIntroductionPanel *panel3 = [[MYIntroductionPanel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) nibNamed:@"TestPanel3"];

//Add custom attributes
panel3.PanelTitle = @"Test Title";
panel3.PanelDescription = @"This is a test panel description to test out the new animations on a custom nib";

//Rebuild panel with new attributes
[panel3 buildPanelWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

Tip Make sure your autoresize properties are set to scale correctly (everything selected worked best for me). If you don't there may be some problems when you design for 4" screens, but deploy on 3.5".

Custom Panels via Subclassing

If you really want to unleash the full power of MYBlurIntroductionView, you will want to subclass an MYIntroductionPanel. If you do, you gain access to many new methods for creating event driven panels in your introduction.

Event Handling

Perhaps you would like to trigger certain actions to occur on a panel when the introduction reaches it. Now that is fully possible by overriding the panelDidAppear and panelDidDisappear methods. Using these methods you can create dynamic panels that reset when the panel disappears.

Stopping

Say, for intstance, you want to make SURE a user knows how to do something in your app. With your subclass, you may now disable the introduction view until they have completed whatever task you like. Once they have done that task, they may go to the next panel. An example of this can be found using the command [self.parentIntroductionView setEnabled:NO]; in the MYCustomPanel class in the sample application. Here, a button press enables movement to the next panel.

DisabledPanel EnabledPanel

Creating a MYIntroductionView and Adding Panels

Assuming you have made a few panels, creating an instance of MYIntroductionView and adding panels can be done in just a few lines of code.

//Create the introduction view and set its delegate
MYBlurIntroductionView *introductionView = [[MYBlurIntroductionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    introductionView.delegate = self;
    introductionView.BackgroundImageView.image = [UIImage imageNamed:@"Toronto, ON.jpg"];
    //introductionView.LanguageDirection = MYLanguageDirectionRightToLeft;

//Feel free to customize your introduction view here
    
//Add panels to an array
NSArray *panels = @[panel1, panel2, panel3, panel4];
    
//Build the introduction with desired panels
[introductionView buildIntroductionWithPanels:panels];

The buildIntroductionWithPanels method is where all the magic happens. After calling this method, the introduction view is ready to display. To finally show it, simply add it as a subview.

//Add the introduction to your view
[self.view addSubview:introductionView];

To see all this in action, head over to the sample project! It creates an introduction view that uses all types of panels so you can understand all that MYBlurIntroductionView has to offer.

Delegation

MYBlurIntroductionView comes with two delegate methods for interacting with the introduction view.

  • introduction:didChangeToPanel:withIndex:
    • This method will hit every time you change panels. Use this to perhaps change background images or blur color.
  • introduction:didFinishWithType:
    • This method triggers when the introduction view has finished. The type of finish is also provided.

About the Author

Matt York is an iOS, Android and C# developer with the Center for Advanced Public Safety (Github Link). CAPS works to develop cutting edge mobile technology for law enforcement in the state of Alabama. Matt is also the founder of the Intercede social network, available in the app store.

Comments
  • MyBlurIntroductionView Rotation

    MyBlurIntroductionView Rotation

    Hello,

    Thanks a lot for your great work.

    I've a problem with your plugin when I rotate my phone. I initialize the view with the controller frame and add it with "addSubView" method but when I pass from Portrait to Landscape, the IntroductionView size doesn't update.

    How I can do that?

    Thanks in advance,

    Best regards.

    P.S: Some methods are deprecated in iOS7.

    enhancement 
    opened by akanass 8
  • App rejection due to use of AMBlurView

    App rejection due to use of AMBlurView

    Apple has just started rejecting apps that use AMBlurView or MDBlurView.

    I have a paid version of my app already approved and it uses this project, but the "lite" version was just reviewed and rejected. When I did a quick search, there are others complaining of the same thing during the last 6 days.

    As a quick fix, I just removed the use of AMBlurView from my project.

    opened by tspinelli 6
  • refactored: apply some principles like DRY or separation of concerns

    refactored: apply some principles like DRY or separation of concerns

    The biggest change is the following:

    • moved the code for hiding/showing of labels from MYBlurIntroductionView to class MYIntroductionPanel
    • apply [MYBlurIntroductionView introduction: didFinishWithType:] after animation finished
    • removed duplicated code in init methods
    opened by ugort 5
  • introductionView setBackgroundColor

    introductionView setBackgroundColor

    Hi, thanks for sharing!

    Trying to set colour for the first screen and it seems to be impossible. [introductionView setBackgroundColor:[UIColor colorWithRed:0.300 green:0.171 blue:0.686 alpha:1.000]];

    Delegate works only after switching screens, so it's not possible to do this either.

    opened by shmidt 5
  • Issue with initWithFrame:(CGRect)frame nibNamed:(NSString *)nibName

    Issue with initWithFrame:(CGRect)frame nibNamed:(NSString *)nibName

    I am getting an error on line 84 in the MYIntroductionPanel class.

    self.isCustomPanel = YES;
    

    It looks like this variable is not getting synthesized properly. I am using the latest version on cocoapods.

    opened by bassrock 4
  • Allow moving to a specific panel

    Allow moving to a specific panel

    The following method is defined but not implemented:

    -(void)changeToPanelAtIndex:(NSInteger)index
    

    Providing this would give users of the library a way to throw a user back to a specific panel if there is some error condition preventing them from continuing.

    opened by misterwell 4
  • Dismiss button?

    Dismiss button?

    Hi there,

    Is there some sort of dismiss function which I can add to a button?

    Also, how can I let this popup only at the first time someone opens the app?

    Thank you for your answers.

    Love your work btw :)

    opened by Alifar 3
  • crashes when swiping from last panel

    crashes when swiping from last panel

    Hi, First of all, I have to say I'm really digging this library! :) When I'm on the last panel, and I try to swipe to the next one, the app crashes with the error: index 3 beyond bounds [0 .. 2]. Any way of fixing this? Thanks!

    opened by orenk86 3
  • Method definition for 'setBlurTintColor:' not found

    Method definition for 'setBlurTintColor:' not found

    Great library! I'm getting the above warning message on the Demo. Any way of resolving this issue with an example of how to apply the blurTintColor properly? Thank you.

    opened by robmontesinos 3
  • Not iOS6 compatible

    Not iOS6 compatible

    The description of this github mentions its iOS6 compatible for iPhone. However there are a few things not compatible:

    • use of NSString boundingRectWithSize:options:attributes:context is iOS7, and not available in iOS6. iOS6 still uses NSString sizeWithFont:ContrainedToSize.
    • xib's cannot be compiled because it needs a later version of the SDK.

    I propose the xib's be used in a seperate IB based example. Since a lot of developers prefer building their interface completely in code anyway.

    opened by iWhacko 3
  • Adding more skip button options

    Adding more skip button options

    I found for my use case I needed a way to make the buttons in the bottom left and right be a back or next or finish button. I added an enum type that allows the developer to specify if they want to show both buttons, 1 button or use it the way it was originally intended. Eventually I am sure we could modify this more to include each type of workflow a dev would need.

    I also purposely did not rename the buttons from SkipButton to keep compatibility that other people may have. I also made the original workflow the standard one.

    opened by bassrock 2
  • How do I check if the introduction is running?

    How do I check if the introduction is running?

    My app needs to behave differently when the tutorial is being displayed. Is there a Bool property that I can check to know whether the tutorial is on or not?

    opened by Sweeper777 0
  • Make margin variables

    Make margin variables

    You should transform : const static CGFloat kTopPadding = 30; const static CGFloat kLeftRightMargins = 20; const static CGFloat kBottomPadding = 48; const static CGFloat kHeaderTitlePadding = 20; const static CGFloat kTitleDescriptionPadding = 20; const static CGFloat kDescriptionImagePadding = 20;

    in public properties initialized with default values.

    opened by LivioGama 0
  • `sizeWithFont:constrainedToSize:lineBreakMode: is deprecated.

    `sizeWithFont:constrainedToSize:lineBreakMode: is deprecated.

    `sizeWithFont:constrainedToSize:lineBreakMode: is deprecated.

    skipStringWidth = [skipString sizeWithFont:kSkipButtonFont constrainedToSize:CGSizeMake(MAXFLOAT, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping].width;

    Use boundingRectWithSize:options:attributes:context:

    Any ideas? I'm new to coding. Thank you!

    opened by emtjoshhart 1
  • display blank image in ios 8.3

    display blank image in ios 8.3

    i have tried various way to check weather my app is getting UIImage or not, But there is some issue with ios 8.3 only, other version its running fine. kindly guide me

    thank in advance.

    opened by komaldaudia 0
Releases(v1.0.3)
  • v1.0.3(Feb 6, 2014)

    • Removed AMBlurView to comply with Apple standards.
    • Added HeaderDoc documentation to public facing methods on MYBlurIntroductionView class
    Source code(tar.gz)
    Source code(zip)
Owner
Matthew York
Matthew York
BWWalkthrough is a simple library that helps you build custom walkthroughs for your iOS App

What is BWWalkthrough? BWWalkthrough (BWWT) is a class that helps you create Walkthroughs for your iOS Apps. It differs from other similar classes in

Yari @bitwaker 2.8k Jan 4, 2023
ColorMix-by-IUKit - colorMix app by Intro to app development in Swift

colorMix-by-IUKit colorMix app by "Intro to app development in Swift" In this ap

null 0 Feb 11, 2022
Show overlay and info on app components

SwiftyOverlay App Intro / Instruction component to show data over app UI at run time! Easy to use, Animated and Customizable. Supported Components are

Saeid 80 Aug 29, 2022
OnboardKit - Customizable user onboarding for your UIKit app in Swift

OnboardKit Customizable user onboarding for your UIKit app in Swift Requirements Swift 5.0 Xcode 10 iOS 11.0+ Installation Carthage github "NikolaKire

Nikola Kirev 470 Dec 23, 2022
A nice tutorial like the one introduced in the Path 3.X App

ICETutorial Welcome to ICETutorial. This small project is an implementation of the newly tutorial introduced by the Path 3.X app. Very simple and effi

Icepat 798 Jun 30, 2022
A simple keyframe-based animation framework for UIKit. Perfect for scrolling app intros.

Jazz Hands is a simple keyframe-based animation framework for UIKit. Animations can be controlled via gestures, scroll views, KVO, or ReactiveCocoa. J

IFTTT 6.4k Dec 28, 2022
A simple keyframe-based animation framework for iOS, written in Swift. Perfect for scrolling app intros.

RazzleDazzle is a simple AutoLayout-friendly keyframe animation framework for iOS, written in Swift. Perfect for scrolling app intros. RazzleDazzle gr

IFTTT 3.4k Jan 1, 2023
Showcase your awesome new app features 📱

WhatsNewKit enables you to easily showcase your awesome new app features. It's designed from the ground up to be fully customized to your needs. Featu

Sven Tiigi 2.8k Jan 3, 2023
Create walkthroughs and guided tours (coach marks) in a simple way, with Swift.

Add customizable coach marks into your iOS project. Available for both iPhone and iPad. ⚠️ Instructions 2.0.1 brings a couple of breaking changes, ple

Frédéric Maquin 4.9k Jan 3, 2023
An iOS framework to easily create a beautiful and engaging onboarding experience with only a few lines of code.

Onboard Click Here For More Examples Important Onboard is no longer under active development, and as such if you create any issues or submit pull requ

Mike 6.5k Dec 17, 2022
An animated popover that pops out a given frame, great for subtle UI tips and onboarding.

Animated popover that pops out of a frame. You can specify the direction of the popover and the arrow that points to its origin. Color, border radius

Andrea Mazzini 3k Jan 8, 2023
A simple and attractive AlertView to onboard your users in your amazing world.

AlertOnboarding A simple and attractive AlertView to onboard your users in your amazing world. PRESENTATION This AlertOnboarding was inspired by this

Boisney Philippe 832 Jan 8, 2023
UIPheonix is a super easy, flexible, dynamic and highly scalable UI framework + concept for building reusable component/control-driven apps for macOS, iOS and tvOS

UIPheonix is a super easy, flexible, dynamic and highly scalable UI framework + concept for building reusable component/control-driven apps for macOS, iOS and tvOS

Mohsan Khan 29 Sep 9, 2022
A minimalistic, thread safe, non-boilerplate and super easy to use version of Active Record on Core Data.

Skopelos A minimalistic, thread-safe, non-boilerplate and super easy to use version of Active Record on Core Data. Simply all you need for doing Core

Alberto De Bortoli 235 Sep 9, 2022
Scrumdinger-ios - Built as a part of iOS app dev tutorials from app-dev-training

Scrumdinger This repository contains the code written during my course of taking

Ashwin Ramakrishnan 1 Jan 23, 2022
Tutorials from sparrowcode.io website. You can add new, translate or fix typos. Also you can add your apps from App Store for free.

Tutorials from sparrowcode.io website. You can add new, translate or fix typos. Also you can add your apps from App Store for free.

Sparrow Code 31 Jan 3, 2023
Tutorials app for WatchKit

WatchKit-Apps App tutorial Videos: Live coding! Last Update: New tutorial about tables - 8-Table Table of Contents Apps Counter Data Sharing AppsCommu

Kostiantyn Koval 1.1k Dec 27, 2022
Tutorials from sparrowcode.io website. You can add new, translate or fix typos. Also you can add your apps from App Store for free.

Страницы доступны на sparrowcode.io/en & sparrowcode.io/ru Как добавить свое приложение Добавьте элемент в json /ru/apps/apps.json. Если ваше приложен

Sparrow Code 30 Nov 25, 2022
Presentation helps you to make tutorials, release notes and animated pages.

Presentation helps you to make tutorials, release notes and animated pages.

HyperRedink 3k Dec 28, 2022
Paul Veillard 4 Mar 31, 2022