NSScrollView/NSCollectionView on NSVisualEffectView cause flickering - objective-c

I have a NSCollectionView within a NSVisualEffectView within a NSPopover. Everytime when it's refreshing(add, remove, reload NSCollectionViewItem, or even just click buttons on the NSCollectionViewItem's view), it has glitches on the controls.
Here's a screenshot I try to get when it's opening:
It's more or less like this but only when the redrawing happens:
Also, if I put a button with border off on it, when clicked the color went off, just like the flickering:
I tried to set background color in different views/controls, but seems the NSCollectionView will always be black/white (depending on UI color selection) when it's empty:
Did I missed anything?
EDIT:
By adding scrollView.needsDisplay = false/true before/after the item change will make some of the flickers gone. Still, most the problems still exist.
Also, if I forcely enabled horizontal scroller bar or disabled autoresize subview, the flicker will no longer show when add/remove items.

I had the same problem using a NSTableView inside a NSPopover. I was able to fix it by setting all the controls to the appearance type Aqua instead of dark/light.

Ok, seems disabling the "Autoresize Subviews" on the problematic view will do the trick.

Related

Disable/Customize NSPopUpButton animation in 10.10 Yosemite

Context:
In OS 10.10, Apple added some new subtle animations to various controls. For example, when you check a checkbox, the blue "checked" state now animates in by expanding outward from the center of the checkbox rather than abruptly switching to the "checked" image.
Similarly, when you open an NSPopUpButton and choose an item from the menu, the menu animates closed and the selected item appears to "zoom into" the popUpButton.
The Problem:
I have customized NSPopUpButtons that draw themselves differently than the default NSPopUpButton:
When I select an item in the pop-up menu, the new animation in 10.10 briefly shows the system-default popUpButton style while animating in (blue right-hand side, etc.).
Here's a screenshot of the animation in progress, showing the system-default popUpButton animating in. (The dark-grey rectangle in the back is the "pressed" state of my custom NSPopUpButton):
What I Need
This animation obviously looks terrible with customized controls. Is there any way to disable it or to customize it? I have been unable to find one.
Turning off the Bordered property in Interface Builder seems to do the trick.
Here’s a comparison of Bordered on and Bordered off.
Please note that the Bordered property was showing as being off by default, when it’s actually on. I just had to check then uncheck it to disable it.

How do I fix empty 44px space in iOS7 view with ViewDeckController?

I am in the process of transitioning an app to iOS7. All of the views throughout the app have a 44px empty space at the bottom that appears to be for a bottom toolbar or something, but I am not trying to display a bottom toolbar. This space also exists on views that do have a bottom toolbar and the toolbar just shows directly above it.
The red space shown is actually a view behind the black view. No matter what size I set the frame of the black view to, the red space is always shown. I am also hiding the status bar in plist, so don't know if this is an artifact from that or if it has something to do with navigation bar as they are both normally 44px in height.
I have looked at the transitioning guide and haven't found anything that's worked. Any ideas to what could be causing this and how to fix?
UPDATE:
I have tried setting edgesForExtendedLayout = UIRectEdgeAll and extendedLayoutIncludesOpaqueBars = YES (also tried NO) with no effect. When I look at the subviews of the navigation controller it shows a UIToolBar as hidden, but shows it contains a frame in the exact area the view refuses to resize to even with autolayout constraints.
UPDATE 2:
This is actually a problem with ViewDeckController (https://github.com/Inferis/ViewDeck) and the way it sets it's center view bounds.
I believe it has to do with the UINavigationBar. Try toggling the following options in Storyboard and see if it solves the problem. Namely, the 'Extend Edges' options:
These options can also be set in code with the edgesForExtendedLayout and extendedLayoutIncludesOpaqueBars properties on UIViewController.
If you are transitioning to iOS 7, you should be using an Auto Layout constraint to anchor to the Bottom Layout guide. Control drag from your view to the Bottom Layout guide and choose Vertical Space from the popup menu.
Using frames in iOS 7 is harder and is the way of the past.
Auto Layout is hard to grasp at first, but it is very powerful once you get the feel.
This is actually a problem with third party library ViewDeckController (https://github.com/Inferis/ViewDeck) and the way it sets centerViewBounds for IIViewDeckControllerIntegrated. I was able to figure it out after changing to IIViewDeckControllerContained and seeing the view sized correctly.
In IIViewDeckController.m, just return self.referenceBounds for iOS7 like it does for IIViewDeckControllerContained.

Can't seem to achieve the same effect on my slide menu as Any.Do

I am trying to create the same type of slide-up/pull-up menu (from the bottom) as the Any.do iPhone app, but not having any success.
The issue I am running into is the app was built with storyboards so I am thinking I might have to scratch that idea and use just code.
Any ideas?
There is no need to get rid of your storyboard to recreate this, that's what IBOutlets are for. Any way, it looks like this was made by creating a UIScrollView that takes up the entire screen. Then add a UITableView to the upper section of the scroll view. Mind you in order for this to work, you'll need to disable scrolling on the scroll view in the background.
From there you can programmatically add the other elements to the scroll view to be rendered off screen, since there are only three they can probably just be buttons. And finally, since scrolling is disabled on the background scroll view you can add an image with a UISwipeGestureRecognizer at the bottom of the screen to manually change the scroll view's content offset property.

Changing what is loaded by a nib file

in my iPad application I have a panel of buttons, I have used an UIImageView as this panel and put buttons on top of it and created my nib file. in some views some button of this panel should not be displayed. so what i do is removing those buttons and decreasing the height of the panel (a UIImageView) then reposition the button to take up the space of the removed button. I have created outlets to all of these.
Is this the way to do this? My problem is if I want to change the order my buttons are displayed at some point I can't do it by simply changing the nib file. I'll have to do some changes in the code as well.
In this case don't use the nib to position the buttons in the first place. It sounds like this is one of the occasional cases where you would be better off working solely from code.
Instead of having to worry about some sort of abstraction that protects your layout if you decide to reposition the buttons and about removing and repositioning buttons, you can just do the layout at runtime once your particular view knows what buttons it needs. Your code is already doing much of the work of layout already (removing and repositioning).

Multiple buttons on navigation bar

I am using code from http://osmorphis.blogspot.com/2009/05/multiple-buttons-on-navigation-bar.html to implement multiple buttons in the navigation bar.
The huge problem I have now is that this construction "leaks" into the main window. By this I mean that if I press (up to about 15px) below the navigation bar the buttons still respond. How can I fix this?
Or does someone have a better way to implement multiple buttons?
It seems likely that your button bounds are extending beyond the navbar bounds. You can confirm this by setting the color of the button to something other than clear. To fix this you can either fix the frame of the buttons, or make sure clipsToBounds property of the containing view is set to YES.