Repository files navigation

NoticeView

A TweetBot-like notice component for iOS.


![Alt text](http://cloud.github.com/downloads/tciuro/NoticeView/screenshot_2.0.1.png)

Usage

  • Drop the WBNoticeView folder in your project
  • Add QuartzCore.framework to your project

New in 3.0: Cleaner API, easier customization and more

First and foremost, please note that in v3.0 the API has changed. Instead of deprecating and complicating the API, it was decided to replace some of the methods. NoticeView is a tiny library, so the impact should be minimal and the code easy to adapt.

Why the change? Prior to v3.0, it was fairly difficult to customize the look and feel given the current structure of the notice classes. This version simplifies that task, improves accessibility, and enhances the utility of the tap to dismiss functionality.

Here is the brief of the changes introduced in v3.0:

  • Adds a .podspec file to the repository.
  • Updated the internals of WBNoticeView to set up accessibility labels and attributes for the notice. These changes make it easy to target the notice views inside of tests while performing functional testing (e.g. KIF https://github.com/square/KIF).
  • It's now easier to customize NoticeView.
  • Tap to dismiss behaviors are much more flexible. It's possible to determine if a notice was dismissed interactively in the dismissal block, allowing for Growl style notifications that can be responded to on tap or automatically dismissed. Notices can also be optionally dismissed via tap before the display duration has expired.

Acknowledgments: big thanks to @blakewatters for taking the time to refactor, document and cleanup the code.

New in 2.4: Specify a completion block when a notice is dismissed

Starting with 2.4, any notice can have a completion block associated with it. This block will be invoked when the notice has been dismissed (works on sticky and non-sticky notices):

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:NSLocalizedString(@"Signup Error", nil) message:NSLocalizedString(@"You need to fill out all entries in this screen to signup.", nil)];
notice.sticky = YES;
notice.dismissedBlock = ^{
NSLog(@"The notice has been dismissed!");
};

New in 2.3.1: Dismissing a Notice Manually

Starting with 2.3.1, any notice with the 'sticky' property set can be dismissed at will. This could happen for example when an specific event is detected. Just invoke 'dismissNotice' on the notice whenever you're ready to dismiss it:

[myNotice dismissNotice];

Check the demo project to see it in action.

New in 2.3: Make any Notice Sticky

Some users have asked whether 'sticky' could be a property of any notice view. Well, I'm happy to report that starting with version 2.3, all notice types can be made sticky. The usage follows the regular pattern, only this time we set the 'sticky' property accordingly:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
notice.sticky = YES;
[notice show];

New in 2.1: Sticky Notice

New in 2.1 is a different type of notice: Sticky. As it name implies, the notice will remain visible until the user taps on it to dismiss it. The usage follows the Error and Success notice pattern:

WBStickyNoticeView *notice = [WBStickyNoticeView stickyNoticeInView:self.view title:@"7 New Tweets."];
[notice show];

NoticeView 1.0 vs 2.0

The behavior in version 1 was "fire and forget". Calling showErrorNoticeInView or showSuccessNoticeInView displayed the notice, but there was no way to retain it for later use. Version 2 allows the developer to instantiate a notice, customize it (optional) and show it. Not only it's possible to retain it, but also customize it anytime with say, a different title and message. Oh, yeah… and it's cleaner too.

Examples

Since version 2 is more flexible, I have eliminated the older examples and replaced them with the new API. Please note that the older API is still there, for backward compatibility.

To display a small error notice:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
[notice show];

If the message provided doesn't fit in one line, the notice will be enlarged to accommodate the text:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."];
[notice show];

To display a small success notice:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
[notice show];

Customizing the Notice

Instead of piling up a bunch of arguments in a method call, I decided to use properties instead. This way, new properties can be added easily without having to clutter the API with specialized methods.

Example: customize a success notice with a bit of transparency and placing the notice at a specific Y coordinate:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
notice.alpha = 0.8;
notice.originY = self.headerView.frame.size.height;
[notice show];

Notes

If you pass nil instead of a valid UIView, an NSInvalidArgumentException exception will be raised.

The default values are the following:

 if (nil == title) title = @"Unknown Error";
if (nil == message) message = @"Information not provided.";
if (0.0 == duration) duration = 0.5;
if (0.0 == delay) delay = 2.0;
if (0.0 == alpha) alpha = 1.0;
if (origin < 0.0) origin = 0.0;

NoticeView SLOCCount Stats

Who doesn't like stats? ;-) Here are some as reported by SLOCCount:

SLOC	Directory SLOC-by-Language (Sorted)
797 NoticeView objc=797
245 NoticeViewiPad objc=245
0 NoticeView.xcode proj (none)
0 top_dir (none)
Totals grouped by language (dominant language first):
objc: 1042 (100.00%)
Total Physical Source Lines of Code (SLOC) = 1,042
Development Effort Estimate, Person-Years (Person-Months) = 0.21 (2.51) (*)
Schedule Estimate, Years (Months) = 0.30 (3.54) (**)
Estimated Average Number of Developers (Effort/Schedule) = 0.71
Total Estimated Cost to Develop = $ 50,119 (***)
(*) Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)
(**) Basic COCOMO model, Months = 2.5 * (person-months**0.38)
(***) Average salary = $100,000/year, overhead = 2.40

SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
http://www.dwheeler.com/sloccount/

Latest salary information
http://www.indeed.com/salary/Software-Engineer.html

Contribute

I'd love to include your contributions. Feel free to improve it, send comments or suggestions. If you have improvements please send me a pull request.

Contact Me

You can ping me on Twitter — @titusmagnus.

About

A TweetBot-like notice component for iOS.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

NoticeView

A TweetBot-like notice component for iOS.


![Alt text](http://cloud.github.com/downloads/tciuro/NoticeView/screenshot_2.0.1.png)

Usage

  • Drop the WBNoticeView folder in your project
  • Add QuartzCore.framework to your project

New in 3.0: Cleaner API, easier customization and more

First and foremost, please note that in v3.0 the API has changed. Instead of deprecating and complicating the API, it was decided to replace some of the methods. NoticeView is a tiny library, so the impact should be minimal and the code easy to adapt.

Why the change? Prior to v3.0, it was fairly difficult to customize the look and feel given the current structure of the notice classes. This version simplifies that task, improves accessibility, and enhances the utility of the tap to dismiss functionality.

Here is the brief of the changes introduced in v3.0:

  • Adds a .podspec file to the repository.
  • Updated the internals of WBNoticeView to set up accessibility labels and attributes for the notice. These changes make it easy to target the notice views inside of tests while performing functional testing (e.g. KIF https://github.com/square/KIF).
  • It's now easier to customize NoticeView.
  • Tap to dismiss behaviors are much more flexible. It's possible to determine if a notice was dismissed interactively in the dismissal block, allowing for Growl style notifications that can be responded to on tap or automatically dismissed. Notices can also be optionally dismissed via tap before the display duration has expired.

Acknowledgments: big thanks to @blakewatters for taking the time to refactor, document and cleanup the code.

New in 2.4: Specify a completion block when a notice is dismissed

Starting with 2.4, any notice can have a completion block associated with it. This block will be invoked when the notice has been dismissed (works on sticky and non-sticky notices):

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:NSLocalizedString(@"Signup Error", nil) message:NSLocalizedString(@"You need to fill out all entries in this screen to signup.", nil)];
notice.sticky = YES;
notice.dismissedBlock = ^{
NSLog(@"The notice has been dismissed!");
};

New in 2.3.1: Dismissing a Notice Manually

Starting with 2.3.1, any notice with the 'sticky' property set can be dismissed at will. This could happen for example when an specific event is detected. Just invoke 'dismissNotice' on the notice whenever you're ready to dismiss it:

[myNotice dismissNotice];

Check the demo project to see it in action.

New in 2.3: Make any Notice Sticky

Some users have asked whether 'sticky' could be a property of any notice view. Well, I'm happy to report that starting with version 2.3, all notice types can be made sticky. The usage follows the regular pattern, only this time we set the 'sticky' property accordingly:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
notice.sticky = YES;
[notice show];

New in 2.1: Sticky Notice

New in 2.1 is a different type of notice: Sticky. As it name implies, the notice will remain visible until the user taps on it to dismiss it. The usage follows the Error and Success notice pattern:

WBStickyNoticeView *notice = [WBStickyNoticeView stickyNoticeInView:self.view title:@"7 New Tweets."];
[notice show];

NoticeView 1.0 vs 2.0

The behavior in version 1 was "fire and forget". Calling showErrorNoticeInView or showSuccessNoticeInView displayed the notice, but there was no way to retain it for later use. Version 2 allows the developer to instantiate a notice, customize it (optional) and show it. Not only it's possible to retain it, but also customize it anytime with say, a different title and message. Oh, yeah… and it's cleaner too.

Examples

Since version 2 is more flexible, I have eliminated the older examples and replaced them with the new API. Please note that the older API is still there, for backward compatibility.

To display a small error notice:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
[notice show];

If the message provided doesn't fit in one line, the notice will be enlarged to accommodate the text:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."];
[notice show];

To display a small success notice:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
[notice show];

Customizing the Notice

Instead of piling up a bunch of arguments in a method call, I decided to use properties instead. This way, new properties can be added easily without having to clutter the API with specialized methods.

Example: customize a success notice with a bit of transparency and placing the notice at a specific Y coordinate:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
notice.alpha = 0.8;
notice.originY = self.headerView.frame.size.height;
[notice show];

Notes

If you pass nil instead of a valid UIView, an NSInvalidArgumentException exception will be raised.

The default values are the following:

 if (nil == title) title = @"Unknown Error";
if (nil == message) message = @"Information not provided.";
if (0.0 == duration) duration = 0.5;
if (0.0 == delay) delay = 2.0;
if (0.0 == alpha) alpha = 1.0;
if (origin < 0.0) origin = 0.0;

NoticeView SLOCCount Stats

Who doesn't like stats? ;-) Here are some as reported by SLOCCount:

SLOC	Directory SLOC-by-Language (Sorted)
797 NoticeView objc=797
245 NoticeViewiPad objc=245
0 NoticeView.xcode proj (none)
0 top_dir (none)
Totals grouped by language (dominant language first):
objc: 1042 (100.00%)
Total Physical Source Lines of Code (SLOC) = 1,042
Development Effort Estimate, Person-Years (Person-Months) = 0.21 (2.51) (*)
Schedule Estimate, Years (Months) = 0.30 (3.54) (**)
Estimated Average Number of Developers (Effort/Schedule) = 0.71
Total Estimated Cost to Develop = $ 50,119 (***)
(*) Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)
(**) Basic COCOMO model, Months = 2.5 * (person-months**0.38)
(***) Average salary = $100,000/year, overhead = 2.40

SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
http://www.dwheeler.com/sloccount/

Latest salary information
http://www.indeed.com/salary/Software-Engineer.html

Contribute

I'd love to include your contributions. Feel free to improve it, send comments or suggestions. If you have improvements please send me a pull request.

Contact Me

You can ping me on Twitter — @titusmagnus.

About

A TweetBot-like notice component for iOS.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NoticeView

A TweetBot-like notice component for iOS.


![Alt text](http://cloud.github.com/downloads/tciuro/NoticeView/screenshot_2.0.1.png)

Usage

  • Drop the WBNoticeView folder in your project
  • Add QuartzCore.framework to your project

New in 3.0: Cleaner API, easier customization and more

First and foremost, please note that in v3.0 the API has changed. Instead of deprecating and complicating the API, it was decided to replace some of the methods. NoticeView is a tiny library, so the impact should be minimal and the code easy to adapt.

Why the change? Prior to v3.0, it was fairly difficult to customize the look and feel given the current structure of the notice classes. This version simplifies that task, improves accessibility, and enhances the utility of the tap to dismiss functionality.

Here is the brief of the changes introduced in v3.0:

  • Adds a .podspec file to the repository.
  • Updated the internals of WBNoticeView to set up accessibility labels and attributes for the notice. These changes make it easy to target the notice views inside of tests while performing functional testing (e.g. KIF https://github.com/square/KIF).
  • It's now easier to customize NoticeView.
  • Tap to dismiss behaviors are much more flexible. It's possible to determine if a notice was dismissed interactively in the dismissal block, allowing for Growl style notifications that can be responded to on tap or automatically dismissed. Notices can also be optionally dismissed via tap before the display duration has expired.

Acknowledgments: big thanks to @blakewatters for taking the time to refactor, document and cleanup the code.

New in 2.4: Specify a completion block when a notice is dismissed

Starting with 2.4, any notice can have a completion block associated with it. This block will be invoked when the notice has been dismissed (works on sticky and non-sticky notices):

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:NSLocalizedString(@"Signup Error", nil) message:NSLocalizedString(@"You need to fill out all entries in this screen to signup.", nil)];
notice.sticky = YES;
notice.dismissedBlock = ^{
NSLog(@"The notice has been dismissed!");
};

New in 2.3.1: Dismissing a Notice Manually

Starting with 2.3.1, any notice with the 'sticky' property set can be dismissed at will. This could happen for example when an specific event is detected. Just invoke 'dismissNotice' on the notice whenever you're ready to dismiss it:

[myNotice dismissNotice];

Check the demo project to see it in action.

New in 2.3: Make any Notice Sticky

Some users have asked whether 'sticky' could be a property of any notice view. Well, I'm happy to report that starting with version 2.3, all notice types can be made sticky. The usage follows the regular pattern, only this time we set the 'sticky' property accordingly:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
notice.sticky = YES;
[notice show];

New in 2.1: Sticky Notice

New in 2.1 is a different type of notice: Sticky. As it name implies, the notice will remain visible until the user taps on it to dismiss it. The usage follows the Error and Success notice pattern:

WBStickyNoticeView *notice = [WBStickyNoticeView stickyNoticeInView:self.view title:@"7 New Tweets."];
[notice show];

NoticeView 1.0 vs 2.0

The behavior in version 1 was "fire and forget". Calling showErrorNoticeInView or showSuccessNoticeInView displayed the notice, but there was no way to retain it for later use. Version 2 allows the developer to instantiate a notice, customize it (optional) and show it. Not only it's possible to retain it, but also customize it anytime with say, a different title and message. Oh, yeah… and it's cleaner too.

Examples

Since version 2 is more flexible, I have eliminated the older examples and replaced them with the new API. Please note that the older API is still there, for backward compatibility.

To display a small error notice:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
[notice show];

If the message provided doesn't fit in one line, the notice will be enlarged to accommodate the text:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."];
[notice show];

To display a small success notice:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
[notice show];

Customizing the Notice

Instead of piling up a bunch of arguments in a method call, I decided to use properties instead. This way, new properties can be added easily without having to clutter the API with specialized methods.

Example: customize a success notice with a bit of transparency and placing the notice at a specific Y coordinate:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
notice.alpha = 0.8;
notice.originY = self.headerView.frame.size.height;
[notice show];

Notes

If you pass nil instead of a valid UIView, an NSInvalidArgumentException exception will be raised.

The default values are the following:

 if (nil == title) title = @"Unknown Error";
if (nil == message) message = @"Information not provided.";
if (0.0 == duration) duration = 0.5;
if (0.0 == delay) delay = 2.0;
if (0.0 == alpha) alpha = 1.0;
if (origin < 0.0) origin = 0.0;

NoticeView SLOCCount Stats

Who doesn't like stats? ;-) Here are some as reported by SLOCCount:

SLOC	Directory SLOC-by-Language (Sorted)
797 NoticeView objc=797
245 NoticeViewiPad objc=245
0 NoticeView.xcode proj (none)
0 top_dir (none)
Totals grouped by language (dominant language first):
objc: 1042 (100.00%)
Total Physical Source Lines of Code (SLOC) = 1,042
Development Effort Estimate, Person-Years (Person-Months) = 0.21 (2.51) (*)
Schedule Estimate, Years (Months) = 0.30 (3.54) (**)
Estimated Average Number of Developers (Effort/Schedule) = 0.71
Total Estimated Cost to Develop = $ 50,119 (***)
(*) Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)
(**) Basic COCOMO model, Months = 2.5 * (person-months**0.38)
(***) Average salary = $100,000/year, overhead = 2.40

SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
http://www.dwheeler.com/sloccount/

Latest salary information
http://www.indeed.com/salary/Software-Engineer.html

Contribute

I'd love to include your contributions. Feel free to improve it, send comments or suggestions. If you have improvements please send me a pull request.

Contact Me

You can ping me on Twitter — @titusmagnus.

About

A TweetBot-like notice component for iOS.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NoticeView

A TweetBot-like notice component for iOS.


![Alt text](http://cloud.github.com/downloads/tciuro/NoticeView/screenshot_2.0.1.png)

Usage

  • Drop the WBNoticeView folder in your project
  • Add QuartzCore.framework to your project

New in 3.0: Cleaner API, easier customization and more

First and foremost, please note that in v3.0 the API has changed. Instead of deprecating and complicating the API, it was decided to replace some of the methods. NoticeView is a tiny library, so the impact should be minimal and the code easy to adapt.

Why the change? Prior to v3.0, it was fairly difficult to customize the look and feel given the current structure of the notice classes. This version simplifies that task, improves accessibility, and enhances the utility of the tap to dismiss functionality.

Here is the brief of the changes introduced in v3.0:

  • Adds a .podspec file to the repository.
  • Updated the internals of WBNoticeView to set up accessibility labels and attributes for the notice. These changes make it easy to target the notice views inside of tests while performing functional testing (e.g. KIF https://github.com/square/KIF).
  • It's now easier to customize NoticeView.
  • Tap to dismiss behaviors are much more flexible. It's possible to determine if a notice was dismissed interactively in the dismissal block, allowing for Growl style notifications that can be responded to on tap or automatically dismissed. Notices can also be optionally dismissed via tap before the display duration has expired.

Acknowledgments: big thanks to @blakewatters for taking the time to refactor, document and cleanup the code.

New in 2.4: Specify a completion block when a notice is dismissed

Starting with 2.4, any notice can have a completion block associated with it. This block will be invoked when the notice has been dismissed (works on sticky and non-sticky notices):

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:NSLocalizedString(@"Signup Error", nil) message:NSLocalizedString(@"You need to fill out all entries in this screen to signup.", nil)];
notice.sticky = YES;
notice.dismissedBlock = ^{
NSLog(@"The notice has been dismissed!");
};

New in 2.3.1: Dismissing a Notice Manually

Starting with 2.3.1, any notice with the 'sticky' property set can be dismissed at will. This could happen for example when an specific event is detected. Just invoke 'dismissNotice' on the notice whenever you're ready to dismiss it:

[myNotice dismissNotice];

Check the demo project to see it in action.

New in 2.3: Make any Notice Sticky

Some users have asked whether 'sticky' could be a property of any notice view. Well, I'm happy to report that starting with version 2.3, all notice types can be made sticky. The usage follows the regular pattern, only this time we set the 'sticky' property accordingly:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
notice.sticky = YES;
[notice show];

New in 2.1: Sticky Notice

New in 2.1 is a different type of notice: Sticky. As it name implies, the notice will remain visible until the user taps on it to dismiss it. The usage follows the Error and Success notice pattern:

WBStickyNoticeView *notice = [WBStickyNoticeView stickyNoticeInView:self.view title:@"7 New Tweets."];
[notice show];

NoticeView 1.0 vs 2.0

The behavior in version 1 was "fire and forget". Calling showErrorNoticeInView or showSuccessNoticeInView displayed the notice, but there was no way to retain it for later use. Version 2 allows the developer to instantiate a notice, customize it (optional) and show it. Not only it's possible to retain it, but also customize it anytime with say, a different title and message. Oh, yeah… and it's cleaner too.

Examples

Since version 2 is more flexible, I have eliminated the older examples and replaced them with the new API. Please note that the older API is still there, for backward compatibility.

To display a small error notice:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
[notice show];

If the message provided doesn't fit in one line, the notice will be enlarged to accommodate the text:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."];
[notice show];

To display a small success notice:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
[notice show];

Customizing the Notice

Instead of piling up a bunch of arguments in a method call, I decided to use properties instead. This way, new properties can be added easily without having to clutter the API with specialized methods.

Example: customize a success notice with a bit of transparency and placing the notice at a specific Y coordinate:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
notice.alpha = 0.8;
notice.originY = self.headerView.frame.size.height;
[notice show];

Notes

If you pass nil instead of a valid UIView, an NSInvalidArgumentException exception will be raised.

The default values are the following:

 if (nil == title) title = @"Unknown Error";
if (nil == message) message = @"Information not provided.";
if (0.0 == duration) duration = 0.5;
if (0.0 == delay) delay = 2.0;
if (0.0 == alpha) alpha = 1.0;
if (origin < 0.0) origin = 0.0;

NoticeView SLOCCount Stats

Who doesn't like stats? ;-) Here are some as reported by SLOCCount:

SLOC	Directory SLOC-by-Language (Sorted)
797 NoticeView objc=797
245 NoticeViewiPad objc=245
0 NoticeView.xcode proj (none)
0 top_dir (none)
Totals grouped by language (dominant language first):
objc: 1042 (100.00%)
Total Physical Source Lines of Code (SLOC) = 1,042
Development Effort Estimate, Person-Years (Person-Months) = 0.21 (2.51) (*)
Schedule Estimate, Years (Months) = 0.30 (3.54) (**)
Estimated Average Number of Developers (Effort/Schedule) = 0.71
Total Estimated Cost to Develop = $ 50,119 (***)
(*) Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)
(**) Basic COCOMO model, Months = 2.5 * (person-months**0.38)
(***) Average salary = $100,000/year, overhead = 2.40

SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
http://www.dwheeler.com/sloccount/

Latest salary information
http://www.indeed.com/salary/Software-Engineer.html

Contribute

I'd love to include your contributions. Feel free to improve it, send comments or suggestions. If you have improvements please send me a pull request.

Contact Me

You can ping me on Twitter — @titusmagnus.

About

A TweetBot-like notice component for iOS.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

NoticeView

A TweetBot-like notice component for iOS.


![Alt text](http://cloud.github.com/downloads/tciuro/NoticeView/screenshot_2.0.1.png)

Usage

  • Drop the WBNoticeView folder in your project
  • Add QuartzCore.framework to your project

New in 3.0: Cleaner API, easier customization and more

First and foremost, please note that in v3.0 the API has changed. Instead of deprecating and complicating the API, it was decided to replace some of the methods. NoticeView is a tiny library, so the impact should be minimal and the code easy to adapt.

Why the change? Prior to v3.0, it was fairly difficult to customize the look and feel given the current structure of the notice classes. This version simplifies that task, improves accessibility, and enhances the utility of the tap to dismiss functionality.

Here is the brief of the changes introduced in v3.0:

  • Adds a .podspec file to the repository.
  • Updated the internals of WBNoticeView to set up accessibility labels and attributes for the notice. These changes make it easy to target the notice views inside of tests while performing functional testing (e.g. KIF https://github.com/square/KIF).
  • It's now easier to customize NoticeView.
  • Tap to dismiss behaviors are much more flexible. It's possible to determine if a notice was dismissed interactively in the dismissal block, allowing for Growl style notifications that can be responded to on tap or automatically dismissed. Notices can also be optionally dismissed via tap before the display duration has expired.

Acknowledgments: big thanks to @blakewatters for taking the time to refactor, document and cleanup the code.

New in 2.4: Specify a completion block when a notice is dismissed

Starting with 2.4, any notice can have a completion block associated with it. This block will be invoked when the notice has been dismissed (works on sticky and non-sticky notices):

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:NSLocalizedString(@"Signup Error", nil) message:NSLocalizedString(@"You need to fill out all entries in this screen to signup.", nil)];
notice.sticky = YES;
notice.dismissedBlock = ^{
NSLog(@"The notice has been dismissed!");
};

New in 2.3.1: Dismissing a Notice Manually

Starting with 2.3.1, any notice with the 'sticky' property set can be dismissed at will. This could happen for example when an specific event is detected. Just invoke 'dismissNotice' on the notice whenever you're ready to dismiss it:

[myNotice dismissNotice];

Check the demo project to see it in action.

New in 2.3: Make any Notice Sticky

Some users have asked whether 'sticky' could be a property of any notice view. Well, I'm happy to report that starting with version 2.3, all notice types can be made sticky. The usage follows the regular pattern, only this time we set the 'sticky' property accordingly:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
notice.sticky = YES;
[notice show];

New in 2.1: Sticky Notice

New in 2.1 is a different type of notice: Sticky. As it name implies, the notice will remain visible until the user taps on it to dismiss it. The usage follows the Error and Success notice pattern:

WBStickyNoticeView *notice = [WBStickyNoticeView stickyNoticeInView:self.view title:@"7 New Tweets."];
[notice show];

NoticeView 1.0 vs 2.0

The behavior in version 1 was "fire and forget". Calling showErrorNoticeInView or showSuccessNoticeInView displayed the notice, but there was no way to retain it for later use. Version 2 allows the developer to instantiate a notice, customize it (optional) and show it. Not only it's possible to retain it, but also customize it anytime with say, a different title and message. Oh, yeah… and it's cleaner too.

Examples

Since version 2 is more flexible, I have eliminated the older examples and replaced them with the new API. Please note that the older API is still there, for backward compatibility.

To display a small error notice:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
[notice show];

If the message provided doesn't fit in one line, the notice will be enlarged to accommodate the text:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."];
[notice show];

To display a small success notice:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
[notice show];

Customizing the Notice

Instead of piling up a bunch of arguments in a method call, I decided to use properties instead. This way, new properties can be added easily without having to clutter the API with specialized methods.

Example: customize a success notice with a bit of transparency and placing the notice at a specific Y coordinate:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
notice.alpha = 0.8;
notice.originY = self.headerView.frame.size.height;
[notice show];

Notes

If you pass nil instead of a valid UIView, an NSInvalidArgumentException exception will be raised.

The default values are the following:

 if (nil == title) title = @"Unknown Error";
if (nil == message) message = @"Information not provided.";
if (0.0 == duration) duration = 0.5;
if (0.0 == delay) delay = 2.0;
if (0.0 == alpha) alpha = 1.0;
if (origin < 0.0) origin = 0.0;

NoticeView SLOCCount Stats

Who doesn't like stats? ;-) Here are some as reported by SLOCCount:

SLOC	Directory SLOC-by-Language (Sorted)
797 NoticeView objc=797
245 NoticeViewiPad objc=245
0 NoticeView.xcode proj (none)
0 top_dir (none)
Totals grouped by language (dominant language first):
objc: 1042 (100.00%)
Total Physical Source Lines of Code (SLOC) = 1,042
Development Effort Estimate, Person-Years (Person-Months) = 0.21 (2.51) (*)
Schedule Estimate, Years (Months) = 0.30 (3.54) (**)
Estimated Average Number of Developers (Effort/Schedule) = 0.71
Total Estimated Cost to Develop = $ 50,119 (***)
(*) Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)
(**) Basic COCOMO model, Months = 2.5 * (person-months**0.38)
(***) Average salary = $100,000/year, overhead = 2.40

SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
http://www.dwheeler.com/sloccount/

Latest salary information
http://www.indeed.com/salary/Software-Engineer.html

Contribute

I'd love to include your contributions. Feel free to improve it, send comments or suggestions. If you have improvements please send me a pull request.

Contact Me

You can ping me on Twitter — @titusmagnus.

About

A TweetBot-like notice component for iOS.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NoticeView

A TweetBot-like notice component for iOS.


![Alt text](http://cloud.github.com/downloads/tciuro/NoticeView/screenshot_2.0.1.png)

Usage

  • Drop the WBNoticeView folder in your project
  • Add QuartzCore.framework to your project

New in 3.0: Cleaner API, easier customization and more

First and foremost, please note that in v3.0 the API has changed. Instead of deprecating and complicating the API, it was decided to replace some of the methods. NoticeView is a tiny library, so the impact should be minimal and the code easy to adapt.

Why the change? Prior to v3.0, it was fairly difficult to customize the look and feel given the current structure of the notice classes. This version simplifies that task, improves accessibility, and enhances the utility of the tap to dismiss functionality.

Here is the brief of the changes introduced in v3.0:

  • Adds a .podspec file to the repository.
  • Updated the internals of WBNoticeView to set up accessibility labels and attributes for the notice. These changes make it easy to target the notice views inside of tests while performing functional testing (e.g. KIF https://github.com/square/KIF).
  • It's now easier to customize NoticeView.
  • Tap to dismiss behaviors are much more flexible. It's possible to determine if a notice was dismissed interactively in the dismissal block, allowing for Growl style notifications that can be responded to on tap or automatically dismissed. Notices can also be optionally dismissed via tap before the display duration has expired.

Acknowledgments: big thanks to @blakewatters for taking the time to refactor, document and cleanup the code.

New in 2.4: Specify a completion block when a notice is dismissed

Starting with 2.4, any notice can have a completion block associated with it. This block will be invoked when the notice has been dismissed (works on sticky and non-sticky notices):

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:NSLocalizedString(@"Signup Error", nil) message:NSLocalizedString(@"You need to fill out all entries in this screen to signup.", nil)];
notice.sticky = YES;
notice.dismissedBlock = ^{
NSLog(@"The notice has been dismissed!");
};

New in 2.3.1: Dismissing a Notice Manually

Starting with 2.3.1, any notice with the 'sticky' property set can be dismissed at will. This could happen for example when an specific event is detected. Just invoke 'dismissNotice' on the notice whenever you're ready to dismiss it:

[myNotice dismissNotice];

Check the demo project to see it in action.

New in 2.3: Make any Notice Sticky

Some users have asked whether 'sticky' could be a property of any notice view. Well, I'm happy to report that starting with version 2.3, all notice types can be made sticky. The usage follows the regular pattern, only this time we set the 'sticky' property accordingly:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
notice.sticky = YES;
[notice show];

New in 2.1: Sticky Notice

New in 2.1 is a different type of notice: Sticky. As it name implies, the notice will remain visible until the user taps on it to dismiss it. The usage follows the Error and Success notice pattern:

WBStickyNoticeView *notice = [WBStickyNoticeView stickyNoticeInView:self.view title:@"7 New Tweets."];
[notice show];

NoticeView 1.0 vs 2.0

The behavior in version 1 was "fire and forget". Calling showErrorNoticeInView or showSuccessNoticeInView displayed the notice, but there was no way to retain it for later use. Version 2 allows the developer to instantiate a notice, customize it (optional) and show it. Not only it's possible to retain it, but also customize it anytime with say, a different title and message. Oh, yeah… and it's cleaner too.

Examples

Since version 2 is more flexible, I have eliminated the older examples and replaced them with the new API. Please note that the older API is still there, for backward compatibility.

To display a small error notice:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
[notice show];

If the message provided doesn't fit in one line, the notice will be enlarged to accommodate the text:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."];
[notice show];

To display a small success notice:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
[notice show];

Customizing the Notice

Instead of piling up a bunch of arguments in a method call, I decided to use properties instead. This way, new properties can be added easily without having to clutter the API with specialized methods.

Example: customize a success notice with a bit of transparency and placing the notice at a specific Y coordinate:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
notice.alpha = 0.8;
notice.originY = self.headerView.frame.size.height;
[notice show];

Notes

If you pass nil instead of a valid UIView, an NSInvalidArgumentException exception will be raised.

The default values are the following:

 if (nil == title) title = @"Unknown Error";
if (nil == message) message = @"Information not provided.";
if (0.0 == duration) duration = 0.5;
if (0.0 == delay) delay = 2.0;
if (0.0 == alpha) alpha = 1.0;
if (origin < 0.0) origin = 0.0;

NoticeView SLOCCount Stats

Who doesn't like stats? ;-) Here are some as reported by SLOCCount:

SLOC	Directory SLOC-by-Language (Sorted)
797 NoticeView objc=797
245 NoticeViewiPad objc=245
0 NoticeView.xcode proj (none)
0 top_dir (none)
Totals grouped by language (dominant language first):
objc: 1042 (100.00%)
Total Physical Source Lines of Code (SLOC) = 1,042
Development Effort Estimate, Person-Years (Person-Months) = 0.21 (2.51) (*)
Schedule Estimate, Years (Months) = 0.30 (3.54) (**)
Estimated Average Number of Developers (Effort/Schedule) = 0.71
Total Estimated Cost to Develop = $ 50,119 (***)
(*) Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)
(**) Basic COCOMO model, Months = 2.5 * (person-months**0.38)
(***) Average salary = $100,000/year, overhead = 2.40

SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
http://www.dwheeler.com/sloccount/

Latest salary information
http://www.indeed.com/salary/Software-Engineer.html

Contribute

I'd love to include your contributions. Feel free to improve it, send comments or suggestions. If you have improvements please send me a pull request.

Contact Me

You can ping me on Twitter — @titusmagnus.

About

A TweetBot-like notice component for iOS.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

NoticeView

A TweetBot-like notice component for iOS.


![Alt text](http://cloud.github.com/downloads/tciuro/NoticeView/screenshot_2.0.1.png)

Usage

  • Drop the WBNoticeView folder in your project
  • Add QuartzCore.framework to your project

New in 3.0: Cleaner API, easier customization and more

First and foremost, please note that in v3.0 the API has changed. Instead of deprecating and complicating the API, it was decided to replace some of the methods. NoticeView is a tiny library, so the impact should be minimal and the code easy to adapt.

Why the change? Prior to v3.0, it was fairly difficult to customize the look and feel given the current structure of the notice classes. This version simplifies that task, improves accessibility, and enhances the utility of the tap to dismiss functionality.

Here is the brief of the changes introduced in v3.0:

  • Adds a .podspec file to the repository.
  • Updated the internals of WBNoticeView to set up accessibility labels and attributes for the notice. These changes make it easy to target the notice views inside of tests while performing functional testing (e.g. KIF https://github.com/square/KIF).
  • It's now easier to customize NoticeView.
  • Tap to dismiss behaviors are much more flexible. It's possible to determine if a notice was dismissed interactively in the dismissal block, allowing for Growl style notifications that can be responded to on tap or automatically dismissed. Notices can also be optionally dismissed via tap before the display duration has expired.

Acknowledgments: big thanks to @blakewatters for taking the time to refactor, document and cleanup the code.

New in 2.4: Specify a completion block when a notice is dismissed

Starting with 2.4, any notice can have a completion block associated with it. This block will be invoked when the notice has been dismissed (works on sticky and non-sticky notices):

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:NSLocalizedString(@"Signup Error", nil) message:NSLocalizedString(@"You need to fill out all entries in this screen to signup.", nil)];
notice.sticky = YES;
notice.dismissedBlock = ^{
NSLog(@"The notice has been dismissed!");
};

New in 2.3.1: Dismissing a Notice Manually

Starting with 2.3.1, any notice with the 'sticky' property set can be dismissed at will. This could happen for example when an specific event is detected. Just invoke 'dismissNotice' on the notice whenever you're ready to dismiss it:

[myNotice dismissNotice];

Check the demo project to see it in action.

New in 2.3: Make any Notice Sticky

Some users have asked whether 'sticky' could be a property of any notice view. Well, I'm happy to report that starting with version 2.3, all notice types can be made sticky. The usage follows the regular pattern, only this time we set the 'sticky' property accordingly:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
notice.sticky = YES;
[notice show];

New in 2.1: Sticky Notice

New in 2.1 is a different type of notice: Sticky. As it name implies, the notice will remain visible until the user taps on it to dismiss it. The usage follows the Error and Success notice pattern:

WBStickyNoticeView *notice = [WBStickyNoticeView stickyNoticeInView:self.view title:@"7 New Tweets."];
[notice show];

NoticeView 1.0 vs 2.0

The behavior in version 1 was "fire and forget". Calling showErrorNoticeInView or showSuccessNoticeInView displayed the notice, but there was no way to retain it for later use. Version 2 allows the developer to instantiate a notice, customize it (optional) and show it. Not only it's possible to retain it, but also customize it anytime with say, a different title and message. Oh, yeah… and it's cleaner too.

Examples

Since version 2 is more flexible, I have eliminated the older examples and replaced them with the new API. Please note that the older API is still there, for backward compatibility.

To display a small error notice:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
[notice show];

If the message provided doesn't fit in one line, the notice will be enlarged to accommodate the text:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."];
[notice show];

To display a small success notice:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
[notice show];

Customizing the Notice

Instead of piling up a bunch of arguments in a method call, I decided to use properties instead. This way, new properties can be added easily without having to clutter the API with specialized methods.

Example: customize a success notice with a bit of transparency and placing the notice at a specific Y coordinate:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
notice.alpha = 0.8;
notice.originY = self.headerView.frame.size.height;
[notice show];

Notes

If you pass nil instead of a valid UIView, an NSInvalidArgumentException exception will be raised.

The default values are the following:

 if (nil == title) title = @"Unknown Error";
if (nil == message) message = @"Information not provided.";
if (0.0 == duration) duration = 0.5;
if (0.0 == delay) delay = 2.0;
if (0.0 == alpha) alpha = 1.0;
if (origin < 0.0) origin = 0.0;

NoticeView SLOCCount Stats

Who doesn't like stats? ;-) Here are some as reported by SLOCCount:

SLOC	Directory SLOC-by-Language (Sorted)
797 NoticeView objc=797
245 NoticeViewiPad objc=245
0 NoticeView.xcode proj (none)
0 top_dir (none)
Totals grouped by language (dominant language first):
objc: 1042 (100.00%)
Total Physical Source Lines of Code (SLOC) = 1,042
Development Effort Estimate, Person-Years (Person-Months) = 0.21 (2.51) (*)
Schedule Estimate, Years (Months) = 0.30 (3.54) (**)
Estimated Average Number of Developers (Effort/Schedule) = 0.71
Total Estimated Cost to Develop = $ 50,119 (***)
(*) Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)
(**) Basic COCOMO model, Months = 2.5 * (person-months**0.38)
(***) Average salary = $100,000/year, overhead = 2.40

SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
http://www.dwheeler.com/sloccount/

Latest salary information
http://www.indeed.com/salary/Software-Engineer.html

Contribute

I'd love to include your contributions. Feel free to improve it, send comments or suggestions. If you have improvements please send me a pull request.

Contact Me

You can ping me on Twitter — @titusmagnus.

About

A TweetBot-like notice component for iOS.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

NoticeView

A TweetBot-like notice component for iOS.


![Alt text](http://cloud.github.com/downloads/tciuro/NoticeView/screenshot_2.0.1.png)

Usage

  • Drop the WBNoticeView folder in your project
  • Add QuartzCore.framework to your project

New in 3.0: Cleaner API, easier customization and more

First and foremost, please note that in v3.0 the API has changed. Instead of deprecating and complicating the API, it was decided to replace some of the methods. NoticeView is a tiny library, so the impact should be minimal and the code easy to adapt.

Why the change? Prior to v3.0, it was fairly difficult to customize the look and feel given the current structure of the notice classes. This version simplifies that task, improves accessibility, and enhances the utility of the tap to dismiss functionality.

Here is the brief of the changes introduced in v3.0:

  • Adds a .podspec file to the repository.
  • Updated the internals of WBNoticeView to set up accessibility labels and attributes for the notice. These changes make it easy to target the notice views inside of tests while performing functional testing (e.g. KIF https://github.com/square/KIF).
  • It's now easier to customize NoticeView.
  • Tap to dismiss behaviors are much more flexible. It's possible to determine if a notice was dismissed interactively in the dismissal block, allowing for Growl style notifications that can be responded to on tap or automatically dismissed. Notices can also be optionally dismissed via tap before the display duration has expired.

Acknowledgments: big thanks to @blakewatters for taking the time to refactor, document and cleanup the code.

New in 2.4: Specify a completion block when a notice is dismissed

Starting with 2.4, any notice can have a completion block associated with it. This block will be invoked when the notice has been dismissed (works on sticky and non-sticky notices):

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:NSLocalizedString(@"Signup Error", nil) message:NSLocalizedString(@"You need to fill out all entries in this screen to signup.", nil)];
notice.sticky = YES;
notice.dismissedBlock = ^{
NSLog(@"The notice has been dismissed!");
};

New in 2.3.1: Dismissing a Notice Manually

Starting with 2.3.1, any notice with the 'sticky' property set can be dismissed at will. This could happen for example when an specific event is detected. Just invoke 'dismissNotice' on the notice whenever you're ready to dismiss it:

[myNotice dismissNotice];

Check the demo project to see it in action.

New in 2.3: Make any Notice Sticky

Some users have asked whether 'sticky' could be a property of any notice view. Well, I'm happy to report that starting with version 2.3, all notice types can be made sticky. The usage follows the regular pattern, only this time we set the 'sticky' property accordingly:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
notice.sticky = YES;
[notice show];

New in 2.1: Sticky Notice

New in 2.1 is a different type of notice: Sticky. As it name implies, the notice will remain visible until the user taps on it to dismiss it. The usage follows the Error and Success notice pattern:

WBStickyNoticeView *notice = [WBStickyNoticeView stickyNoticeInView:self.view title:@"7 New Tweets."];
[notice show];

NoticeView 1.0 vs 2.0

The behavior in version 1 was "fire and forget". Calling showErrorNoticeInView or showSuccessNoticeInView displayed the notice, but there was no way to retain it for later use. Version 2 allows the developer to instantiate a notice, customize it (optional) and show it. Not only it's possible to retain it, but also customize it anytime with say, a different title and message. Oh, yeah… and it's cleaner too.

Examples

Since version 2 is more flexible, I have eliminated the older examples and replaced them with the new API. Please note that the older API is still there, for backward compatibility.

To display a small error notice:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Check your network connection."];
[notice show];

If the message provided doesn't fit in one line, the notice will be enlarged to accommodate the text:

WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:@"Network Error" message:@"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."];
[notice show];

To display a small success notice:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
[notice show];

Customizing the Notice

Instead of piling up a bunch of arguments in a method call, I decided to use properties instead. This way, new properties can be added easily without having to clutter the API with specialized methods.

Example: customize a success notice with a bit of transparency and placing the notice at a specific Y coordinate:

WBSuccessNoticeView *notice = [WBSuccessNoticeView successNoticeInView:self.view title:@"Link Saved Successfully"];
notice.alpha = 0.8;
notice.originY = self.headerView.frame.size.height;
[notice show];

Notes

If you pass nil instead of a valid UIView, an NSInvalidArgumentException exception will be raised.

The default values are the following:

 if (nil == title) title = @"Unknown Error";
if (nil == message) message = @"Information not provided.";
if (0.0 == duration) duration = 0.5;
if (0.0 == delay) delay = 2.0;
if (0.0 == alpha) alpha = 1.0;
if (origin < 0.0) origin = 0.0;

NoticeView SLOCCount Stats

Who doesn't like stats? ;-) Here are some as reported by SLOCCount:

SLOC	Directory SLOC-by-Language (Sorted)
797 NoticeView objc=797
245 NoticeViewiPad objc=245
0 NoticeView.xcode proj (none)
0 top_dir (none)
Totals grouped by language (dominant language first):
objc: 1042 (100.00%)
Total Physical Source Lines of Code (SLOC) = 1,042
Development Effort Estimate, Person-Years (Person-Months) = 0.21 (2.51) (*)
Schedule Estimate, Years (Months) = 0.30 (3.54) (**)
Estimated Average Number of Developers (Effort/Schedule) = 0.71
Total Estimated Cost to Develop = $ 50,119 (***)
(*) Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)
(**) Basic COCOMO model, Months = 2.5 * (person-months**0.38)
(***) Average salary = $100,000/year, overhead = 2.40

SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
http://www.dwheeler.com/sloccount/

Latest salary information
http://www.indeed.com/salary/Software-Engineer.html

Contribute

I'd love to include your contributions. Feel free to improve it, send comments or suggestions. If you have improvements please send me a pull request.

Contact Me

You can ping me on Twitter — @titusmagnus.

About

A TweetBot-like notice component for iOS.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages