Skip to content

fixed an issue with custom container view controllers - #57

Open
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller
Open

fixed an issue with custom container view controllers#57
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller

Conversation

@jjochen

Copy link
Copy Markdown

when the origin.y of the child view controller is not 0 the notification view is to big

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you deriving the origin from the application's root view controller? This may fit your special usecase but it is not a general-purpose solution.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

convertPoint: gets the origin of the parent(Navigation)ViewController inside of the keyWindow.
Using the rootViewController instead of the keyWindow directly, solves some problems with rotations.

The notificationView.origin.y is the top of the parentViewController not the top of the keyWindow. So you should subtract the height of the status bar only if the origin of the parentViewController is actually the top of the keyWindow. Otherwise you have to calculate the height of the notificationView somehow differently. Perhaps there is a better way to achieve that.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, now I understand what you are trying to achieve.
However: You are mixing visual impression ("being at the top of the screen") with the logical representation in Apple's frameworks. This is a little too hacky for me and it looks like it can easily break.

topLayoutGuideLengthCalculation tries to calculate the vertical indentation from 0 to y in the parentViewController or parentNavigationController because topLayoutGuide is not always reliable / useful (e.g. when presenting in a UINavigationController). Hence, the name of the method.

In you case (modal popover on iPad), using the parent's layout guide is enough.

return [self.parentViewController.topLayoutGuide length];

However, this does not work as a general solution (try yourself ;) ).

ATM, I don't have a satisfying answer to this. In principle, we need a way to express the condition of being in a modal popover via API calls (on iOS 7 and iOS 8).

Do you have any idea?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually in my case it's not a modal popover on iPad but a custom content view controller.

My logic was that the status bar height should only be added to the ´topLayoutGuide´ when the view controller frame actually has an intersection with the status bar frame. I haven't got an idea how to achieve that without using ´convertRect:fromView:´ or something similar.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when the view controller frame actually has an intersection with the status bar frame

This may be a correlation with your usecase but isn't what we want to express.
I am unhappy with the situation, too, but I don't like the approach of checking the view's location on screen.

I just spent an hour looking for a solution. Three ways:

  • Using the layout guide may work if we hooked into the parentViewController's viewDidLayoutSubviews method. However, this is very invasive behavior. But this way would allow binding the topLayoutGuide's length to the CSNotificationView's height. It remains to be seen whether this is backwards compatible to iOS 7.
  • Use the topLayoutGuide and deal with the following problem: when transitioning between view controllers, CSNotificationView recalculates its height since a presented view controller may have a navigation bar hidden / present. We do this in navigationControllerWillShowViewControllerNotification. If we use topLayoutGuide here, it is not set yet because AutoLayout has not done its work at this point. One could postpone the resize to navigationControllerDidShowViewControllerNotification (resulting in a delayed resize animation). Since users already rely on a smooth animation, I don't want to break this.
  • Making the height (or addStatusBarHeight) a property of CSNotificationView would allow app developers to implement those bindings externally. This may be the easiest solution.

I currently do not have the time to do this myself. If you provide a clean implementation of the addStatusBarHeight property that does not break the current behavior, I am happy to merge :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jjochen@problame
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fixed an issue with custom container view controllers by jjochen · Pull Request #57 · problame/CSNotificationView · GitHub
Skip to content

fixed an issue with custom container view controllers - #57

Open
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller
Open

fixed an issue with custom container view controllers#57
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller

Conversation

@jjochen

Copy link
Copy Markdown

when the origin.y of the child view controller is not 0 the notification view is to big

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you deriving the origin from the application's root view controller? This may fit your special usecase but it is not a general-purpose solution.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

convertPoint: gets the origin of the parent(Navigation)ViewController inside of the keyWindow.
Using the rootViewController instead of the keyWindow directly, solves some problems with rotations.

The notificationView.origin.y is the top of the parentViewController not the top of the keyWindow. So you should subtract the height of the status bar only if the origin of the parentViewController is actually the top of the keyWindow. Otherwise you have to calculate the height of the notificationView somehow differently. Perhaps there is a better way to achieve that.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, now I understand what you are trying to achieve.
However: You are mixing visual impression ("being at the top of the screen") with the logical representation in Apple's frameworks. This is a little too hacky for me and it looks like it can easily break.

topLayoutGuideLengthCalculation tries to calculate the vertical indentation from 0 to y in the parentViewController or parentNavigationController because topLayoutGuide is not always reliable / useful (e.g. when presenting in a UINavigationController). Hence, the name of the method.

In you case (modal popover on iPad), using the parent's layout guide is enough.

return [self.parentViewController.topLayoutGuide length];

However, this does not work as a general solution (try yourself ;) ).

ATM, I don't have a satisfying answer to this. In principle, we need a way to express the condition of being in a modal popover via API calls (on iOS 7 and iOS 8).

Do you have any idea?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually in my case it's not a modal popover on iPad but a custom content view controller.

My logic was that the status bar height should only be added to the ´topLayoutGuide´ when the view controller frame actually has an intersection with the status bar frame. I haven't got an idea how to achieve that without using ´convertRect:fromView:´ or something similar.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when the view controller frame actually has an intersection with the status bar frame

This may be a correlation with your usecase but isn't what we want to express.
I am unhappy with the situation, too, but I don't like the approach of checking the view's location on screen.

I just spent an hour looking for a solution. Three ways:

  • Using the layout guide may work if we hooked into the parentViewController's viewDidLayoutSubviews method. However, this is very invasive behavior. But this way would allow binding the topLayoutGuide's length to the CSNotificationView's height. It remains to be seen whether this is backwards compatible to iOS 7.
  • Use the topLayoutGuide and deal with the following problem: when transitioning between view controllers, CSNotificationView recalculates its height since a presented view controller may have a navigation bar hidden / present. We do this in navigationControllerWillShowViewControllerNotification. If we use topLayoutGuide here, it is not set yet because AutoLayout has not done its work at this point. One could postpone the resize to navigationControllerDidShowViewControllerNotification (resulting in a delayed resize animation). Since users already rely on a smooth animation, I don't want to break this.
  • Making the height (or addStatusBarHeight) a property of CSNotificationView would allow app developers to implement those bindings externally. This may be the easiest solution.

I currently do not have the time to do this myself. If you provide a clean implementation of the addStatusBarHeight property that does not break the current behavior, I am happy to merge :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fixed an issue with custom container view controllers - #57

Open
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller
Open

fixed an issue with custom container view controllers#57
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller

Conversation

@jjochen

Copy link
Copy Markdown

when the origin.y of the child view controller is not 0 the notification view is to big

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you deriving the origin from the application's root view controller? This may fit your special usecase but it is not a general-purpose solution.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

convertPoint: gets the origin of the parent(Navigation)ViewController inside of the keyWindow.
Using the rootViewController instead of the keyWindow directly, solves some problems with rotations.

The notificationView.origin.y is the top of the parentViewController not the top of the keyWindow. So you should subtract the height of the status bar only if the origin of the parentViewController is actually the top of the keyWindow. Otherwise you have to calculate the height of the notificationView somehow differently. Perhaps there is a better way to achieve that.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, now I understand what you are trying to achieve.
However: You are mixing visual impression ("being at the top of the screen") with the logical representation in Apple's frameworks. This is a little too hacky for me and it looks like it can easily break.

topLayoutGuideLengthCalculation tries to calculate the vertical indentation from 0 to y in the parentViewController or parentNavigationController because topLayoutGuide is not always reliable / useful (e.g. when presenting in a UINavigationController). Hence, the name of the method.

In you case (modal popover on iPad), using the parent's layout guide is enough.

return [self.parentViewController.topLayoutGuide length];

However, this does not work as a general solution (try yourself ;) ).

ATM, I don't have a satisfying answer to this. In principle, we need a way to express the condition of being in a modal popover via API calls (on iOS 7 and iOS 8).

Do you have any idea?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually in my case it's not a modal popover on iPad but a custom content view controller.

My logic was that the status bar height should only be added to the ´topLayoutGuide´ when the view controller frame actually has an intersection with the status bar frame. I haven't got an idea how to achieve that without using ´convertRect:fromView:´ or something similar.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when the view controller frame actually has an intersection with the status bar frame

This may be a correlation with your usecase but isn't what we want to express.
I am unhappy with the situation, too, but I don't like the approach of checking the view's location on screen.

I just spent an hour looking for a solution. Three ways:

  • Using the layout guide may work if we hooked into the parentViewController's viewDidLayoutSubviews method. However, this is very invasive behavior. But this way would allow binding the topLayoutGuide's length to the CSNotificationView's height. It remains to be seen whether this is backwards compatible to iOS 7.
  • Use the topLayoutGuide and deal with the following problem: when transitioning between view controllers, CSNotificationView recalculates its height since a presented view controller may have a navigation bar hidden / present. We do this in navigationControllerWillShowViewControllerNotification. If we use topLayoutGuide here, it is not set yet because AutoLayout has not done its work at this point. One could postpone the resize to navigationControllerDidShowViewControllerNotification (resulting in a delayed resize animation). Since users already rely on a smooth animation, I don't want to break this.
  • Making the height (or addStatusBarHeight) a property of CSNotificationView would allow app developers to implement those bindings externally. This may be the easiest solution.

I currently do not have the time to do this myself. If you provide a clean implementation of the addStatusBarHeight property that does not break the current behavior, I am happy to merge :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fixed an issue with custom container view controllers - #57

Open
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller
Open

fixed an issue with custom container view controllers#57
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller

Conversation

@jjochen

Copy link
Copy Markdown

when the origin.y of the child view controller is not 0 the notification view is to big

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you deriving the origin from the application's root view controller? This may fit your special usecase but it is not a general-purpose solution.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

convertPoint: gets the origin of the parent(Navigation)ViewController inside of the keyWindow.
Using the rootViewController instead of the keyWindow directly, solves some problems with rotations.

The notificationView.origin.y is the top of the parentViewController not the top of the keyWindow. So you should subtract the height of the status bar only if the origin of the parentViewController is actually the top of the keyWindow. Otherwise you have to calculate the height of the notificationView somehow differently. Perhaps there is a better way to achieve that.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, now I understand what you are trying to achieve.
However: You are mixing visual impression ("being at the top of the screen") with the logical representation in Apple's frameworks. This is a little too hacky for me and it looks like it can easily break.

topLayoutGuideLengthCalculation tries to calculate the vertical indentation from 0 to y in the parentViewController or parentNavigationController because topLayoutGuide is not always reliable / useful (e.g. when presenting in a UINavigationController). Hence, the name of the method.

In you case (modal popover on iPad), using the parent's layout guide is enough.

return [self.parentViewController.topLayoutGuide length];

However, this does not work as a general solution (try yourself ;) ).

ATM, I don't have a satisfying answer to this. In principle, we need a way to express the condition of being in a modal popover via API calls (on iOS 7 and iOS 8).

Do you have any idea?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually in my case it's not a modal popover on iPad but a custom content view controller.

My logic was that the status bar height should only be added to the ´topLayoutGuide´ when the view controller frame actually has an intersection with the status bar frame. I haven't got an idea how to achieve that without using ´convertRect:fromView:´ or something similar.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when the view controller frame actually has an intersection with the status bar frame

This may be a correlation with your usecase but isn't what we want to express.
I am unhappy with the situation, too, but I don't like the approach of checking the view's location on screen.

I just spent an hour looking for a solution. Three ways:

  • Using the layout guide may work if we hooked into the parentViewController's viewDidLayoutSubviews method. However, this is very invasive behavior. But this way would allow binding the topLayoutGuide's length to the CSNotificationView's height. It remains to be seen whether this is backwards compatible to iOS 7.
  • Use the topLayoutGuide and deal with the following problem: when transitioning between view controllers, CSNotificationView recalculates its height since a presented view controller may have a navigation bar hidden / present. We do this in navigationControllerWillShowViewControllerNotification. If we use topLayoutGuide here, it is not set yet because AutoLayout has not done its work at this point. One could postpone the resize to navigationControllerDidShowViewControllerNotification (resulting in a delayed resize animation). Since users already rely on a smooth animation, I don't want to break this.
  • Making the height (or addStatusBarHeight) a property of CSNotificationView would allow app developers to implement those bindings externally. This may be the easiest solution.

I currently do not have the time to do this myself. If you provide a clean implementation of the addStatusBarHeight property that does not break the current behavior, I am happy to merge :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fixed an issue with custom container view controllers - #57

Open
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller
Open

fixed an issue with custom container view controllers#57
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller

Conversation

@jjochen

Copy link
Copy Markdown

when the origin.y of the child view controller is not 0 the notification view is to big

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you deriving the origin from the application's root view controller? This may fit your special usecase but it is not a general-purpose solution.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

convertPoint: gets the origin of the parent(Navigation)ViewController inside of the keyWindow.
Using the rootViewController instead of the keyWindow directly, solves some problems with rotations.

The notificationView.origin.y is the top of the parentViewController not the top of the keyWindow. So you should subtract the height of the status bar only if the origin of the parentViewController is actually the top of the keyWindow. Otherwise you have to calculate the height of the notificationView somehow differently. Perhaps there is a better way to achieve that.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, now I understand what you are trying to achieve.
However: You are mixing visual impression ("being at the top of the screen") with the logical representation in Apple's frameworks. This is a little too hacky for me and it looks like it can easily break.

topLayoutGuideLengthCalculation tries to calculate the vertical indentation from 0 to y in the parentViewController or parentNavigationController because topLayoutGuide is not always reliable / useful (e.g. when presenting in a UINavigationController). Hence, the name of the method.

In you case (modal popover on iPad), using the parent's layout guide is enough.

return [self.parentViewController.topLayoutGuide length];

However, this does not work as a general solution (try yourself ;) ).

ATM, I don't have a satisfying answer to this. In principle, we need a way to express the condition of being in a modal popover via API calls (on iOS 7 and iOS 8).

Do you have any idea?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually in my case it's not a modal popover on iPad but a custom content view controller.

My logic was that the status bar height should only be added to the ´topLayoutGuide´ when the view controller frame actually has an intersection with the status bar frame. I haven't got an idea how to achieve that without using ´convertRect:fromView:´ or something similar.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when the view controller frame actually has an intersection with the status bar frame

This may be a correlation with your usecase but isn't what we want to express.
I am unhappy with the situation, too, but I don't like the approach of checking the view's location on screen.

I just spent an hour looking for a solution. Three ways:

  • Using the layout guide may work if we hooked into the parentViewController's viewDidLayoutSubviews method. However, this is very invasive behavior. But this way would allow binding the topLayoutGuide's length to the CSNotificationView's height. It remains to be seen whether this is backwards compatible to iOS 7.
  • Use the topLayoutGuide and deal with the following problem: when transitioning between view controllers, CSNotificationView recalculates its height since a presented view controller may have a navigation bar hidden / present. We do this in navigationControllerWillShowViewControllerNotification. If we use topLayoutGuide here, it is not set yet because AutoLayout has not done its work at this point. One could postpone the resize to navigationControllerDidShowViewControllerNotification (resulting in a delayed resize animation). Since users already rely on a smooth animation, I don't want to break this.
  • Making the height (or addStatusBarHeight) a property of CSNotificationView would allow app developers to implement those bindings externally. This may be the easiest solution.

I currently do not have the time to do this myself. If you provide a clean implementation of the addStatusBarHeight property that does not break the current behavior, I am happy to merge :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fixed an issue with custom container view controllers - #57

Open
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller
Open

fixed an issue with custom container view controllers#57
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller

Conversation

@jjochen

Copy link
Copy Markdown

when the origin.y of the child view controller is not 0 the notification view is to big

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you deriving the origin from the application's root view controller? This may fit your special usecase but it is not a general-purpose solution.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

convertPoint: gets the origin of the parent(Navigation)ViewController inside of the keyWindow.
Using the rootViewController instead of the keyWindow directly, solves some problems with rotations.

The notificationView.origin.y is the top of the parentViewController not the top of the keyWindow. So you should subtract the height of the status bar only if the origin of the parentViewController is actually the top of the keyWindow. Otherwise you have to calculate the height of the notificationView somehow differently. Perhaps there is a better way to achieve that.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, now I understand what you are trying to achieve.
However: You are mixing visual impression ("being at the top of the screen") with the logical representation in Apple's frameworks. This is a little too hacky for me and it looks like it can easily break.

topLayoutGuideLengthCalculation tries to calculate the vertical indentation from 0 to y in the parentViewController or parentNavigationController because topLayoutGuide is not always reliable / useful (e.g. when presenting in a UINavigationController). Hence, the name of the method.

In you case (modal popover on iPad), using the parent's layout guide is enough.

return [self.parentViewController.topLayoutGuide length];

However, this does not work as a general solution (try yourself ;) ).

ATM, I don't have a satisfying answer to this. In principle, we need a way to express the condition of being in a modal popover via API calls (on iOS 7 and iOS 8).

Do you have any idea?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually in my case it's not a modal popover on iPad but a custom content view controller.

My logic was that the status bar height should only be added to the ´topLayoutGuide´ when the view controller frame actually has an intersection with the status bar frame. I haven't got an idea how to achieve that without using ´convertRect:fromView:´ or something similar.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when the view controller frame actually has an intersection with the status bar frame

This may be a correlation with your usecase but isn't what we want to express.
I am unhappy with the situation, too, but I don't like the approach of checking the view's location on screen.

I just spent an hour looking for a solution. Three ways:

  • Using the layout guide may work if we hooked into the parentViewController's viewDidLayoutSubviews method. However, this is very invasive behavior. But this way would allow binding the topLayoutGuide's length to the CSNotificationView's height. It remains to be seen whether this is backwards compatible to iOS 7.
  • Use the topLayoutGuide and deal with the following problem: when transitioning between view controllers, CSNotificationView recalculates its height since a presented view controller may have a navigation bar hidden / present. We do this in navigationControllerWillShowViewControllerNotification. If we use topLayoutGuide here, it is not set yet because AutoLayout has not done its work at this point. One could postpone the resize to navigationControllerDidShowViewControllerNotification (resulting in a delayed resize animation). Since users already rely on a smooth animation, I don't want to break this.
  • Making the height (or addStatusBarHeight) a property of CSNotificationView would allow app developers to implement those bindings externally. This may be the easiest solution.

I currently do not have the time to do this myself. If you provide a clean implementation of the addStatusBarHeight property that does not break the current behavior, I am happy to merge :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jjochen@problame
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); fixed an issue with custom container view controllers by jjochen · Pull Request #57 · problame/CSNotificationView · GitHub
Skip to content

fixed an issue with custom container view controllers - #57

Open
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller
Open

fixed an issue with custom container view controllers#57
jjochen wants to merge 2 commits into
problame:masterfrom
jjochen:fix/custom_container_view_controller

Conversation

@jjochen

Copy link
Copy Markdown

when the origin.y of the child view controller is not 0 the notification view is to big

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you deriving the origin from the application's root view controller? This may fit your special usecase but it is not a general-purpose solution.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

convertPoint: gets the origin of the parent(Navigation)ViewController inside of the keyWindow.
Using the rootViewController instead of the keyWindow directly, solves some problems with rotations.

The notificationView.origin.y is the top of the parentViewController not the top of the keyWindow. So you should subtract the height of the status bar only if the origin of the parentViewController is actually the top of the keyWindow. Otherwise you have to calculate the height of the notificationView somehow differently. Perhaps there is a better way to achieve that.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, now I understand what you are trying to achieve.
However: You are mixing visual impression ("being at the top of the screen") with the logical representation in Apple's frameworks. This is a little too hacky for me and it looks like it can easily break.

topLayoutGuideLengthCalculation tries to calculate the vertical indentation from 0 to y in the parentViewController or parentNavigationController because topLayoutGuide is not always reliable / useful (e.g. when presenting in a UINavigationController). Hence, the name of the method.

In you case (modal popover on iPad), using the parent's layout guide is enough.

return [self.parentViewController.topLayoutGuide length];

However, this does not work as a general solution (try yourself ;) ).

ATM, I don't have a satisfying answer to this. In principle, we need a way to express the condition of being in a modal popover via API calls (on iOS 7 and iOS 8).

Do you have any idea?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually in my case it's not a modal popover on iPad but a custom content view controller.

My logic was that the status bar height should only be added to the ´topLayoutGuide´ when the view controller frame actually has an intersection with the status bar frame. I haven't got an idea how to achieve that without using ´convertRect:fromView:´ or something similar.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when the view controller frame actually has an intersection with the status bar frame

This may be a correlation with your usecase but isn't what we want to express.
I am unhappy with the situation, too, but I don't like the approach of checking the view's location on screen.

I just spent an hour looking for a solution. Three ways:

  • Using the layout guide may work if we hooked into the parentViewController's viewDidLayoutSubviews method. However, this is very invasive behavior. But this way would allow binding the topLayoutGuide's length to the CSNotificationView's height. It remains to be seen whether this is backwards compatible to iOS 7.
  • Use the topLayoutGuide and deal with the following problem: when transitioning between view controllers, CSNotificationView recalculates its height since a presented view controller may have a navigation bar hidden / present. We do this in navigationControllerWillShowViewControllerNotification. If we use topLayoutGuide here, it is not set yet because AutoLayout has not done its work at this point. One could postpone the resize to navigationControllerDidShowViewControllerNotification (resulting in a delayed resize animation). Since users already rely on a smooth animation, I don't want to break this.
  • Making the height (or addStatusBarHeight) a property of CSNotificationView would allow app developers to implement those bindings externally. This may be the easiest solution.

I currently do not have the time to do this myself. If you provide a clean implementation of the addStatusBarHeight property that does not break the current behavior, I am happy to merge :)

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jjochen@problame