I have a master and detail view controller. I have a button that currently disappears after the push segue to the detail and reappears when the pop segue is called, whether it's the interactive gesture or the back button.
This looks really abrupt and I wanted to fade in the alpha on the button with the pop gesture but I don't see any delegate or datasource methods for UINavigationControllerDelegate that show the progress of the pop gesture. Are there any libraries that help with this?
This can be accomplished with a UIView animation.
The idea is to set the alpha of the button to 0 so that it is invisible and then animate it to a value of 1 to create a fade-in effect.
self.myButton.alpha = 0;
[[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
self.myButton.alpha = 1;
} completion:^(BOOL finished) {
// Code for completion of animation.
}];
This could be placed in the viewDidAppear: method of your view controller.
Related
in Controller A: here the Code:
[UIView animateWithDuration:5 animations:^{
[self.awardScrollView setContentOffset:CGPointMake(self.awardScrollView.frame.size.width * 19, 0)];
} completion:^(BOOL finished) {
isFinished = YES;
}];
i set 5s to finish the animation,but i switch controller to B with TabBarController,i found the animation is stop in Controller A.How can i let the ScrollView continue Scroll Background in Controller A even i Switch to Controller B?
Core Animation won't animate a view that's not in the on-screen view hierarchy. When a view is removed from the on-screen view hierarchy, Core Animation removes all animations from the view.
You can add another animation when the view comes back on screen if you want.
Does anyone has an idea if PKRevealController has a method to add an overlay (dim) effect to the hidden controller when the right/left view slides in ?
https://github.com/pkluz/PKRevealController
Like I saw inside the example code, you can check which kind of state you have for a specific UIViewController. Can't you add a new UIView make it black with alpha:0.6 and set it hidden. If the UIViewController did change to the state in background, animate the hidden View like
[UIView animateWithDuration:0.5 animations:^{
[OverlayView setHidden:NO];
}];
Inside viewDidAppear you can check if your OverlayView is hidden:YES and animate it to NO.
i implemented the method in ViewController A
- (BOOL)prefersStatusBarHidden {
return NO;
}
i implemented the method in ViewController B
- (BOOL)prefersStatusBarHidden {
return YES;
}
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return UIStatusBarAnimationSlide; // when doing hiding animation i want it to slide up
}
i implemented a class T that conforms for viewController transitioning say AtoBTransition, i used this ViewControllerTransition for Transitioning From vc(viewcontroller) A to vc B. when transitioning to vc B i want the status bar to slide up (hide with sliding animation) but in this case, it seems that it doesn't do that the sliding animation.
Questions: Just Assume that i didn't do UIStatusBar related code in class T, and didn't add the value View controller-based status bar appearance in info plist. And transition T works perfectly as needed.
i'm sure the code reads in -preferredStatusBarUpdateAnimation by doing breakpoint or logging but why it didn't hiding statusbar animation by sliding? when i toggle to slowmotion in simulator. it appears it doesn't do animation.
my theory is that it conflicts with transition animation context, so is it possible to do animation of hiding UIStatusBar within the implementation of T as part of its transition scheme?
is it possible to do UIStatusBar animation along with ViewControllerAnimationTransition?
feel free to clear some stuff. thanks ahead.. :)
I don't think you can do this directly with iOS 7 's view controller transition API.
Now, I'm assuming based on the hooks to this API and the status bar API that the status bar is an animal unto itself and is not available for animating with a custom transition. I think this is the case because when the UIViewControllerContextTransitioning transitionContext is created for you view controller A is already added to it's containerView and because you're responsible for adding view controller B to the containerView (because you need to transition to it) all of view controller B's status bar manipulation methods are fired when you do so.
However, you can animate UIApplication's keyWindow's frame during your animation transition So in the -animateTransition: method of your class that implements UIViewControllerAnimatedTransitioning.
[UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[UIApplication sharedApplication].keyWindow.frame = CGRectMake(0, 0, 320, 568); // move frame up
} completion:^(BOOL finished) {
// assuming
[UIApplication sharedApplication].keyWindow.frame = CGRectMake(0, 20, 320, 568); //move frame down
}];
If you go with this approach, you'll probably need to adjust the frame of the key window in view controller A to drop below the status bar and be styled light/dark as needed. Then do the opposite to get the effect you want in view controller B. Its nasty, but it could work.
Possible so many duplicates of this question , but i didn't find any solution.
I want to slide up my view when user slideup gesture
here is my scenario
https://app.box.com/s/unt3gyahpx0ax187c5rv
Custom Tabbar is on Top and below is view whci can be slide up/down.
Here is my animation code.
[UIView transitionWithView:self.topView duration:10 options:UIViewAnimationOptionTransitionNone animations:
^{
self.topView.frame = CGRectMake(0,-300,1024,141);
}
completion:^(BOOL finished){}];
But the output is
https://app.box.com/s/fjm1x081jcex1916wyne
I want to slide this view behind the custom tabbar.
I hope you understand my problem.
I am using the code snippet from Tito to add a custom button to my tab bar:
https://github.com/tciuro/CustomTabBar
(Subclassing UITabbarController and adding a custom button using
// .. created a UIButton *button
[self.view addSubview:button];
)
This works great with my storyboard-based app except for the case of a subview within a navigation controller with the option "Hides bottom bar on push" enabled.
This hides the tab bar as promised, but not the custom button.
Seems like the button should be added as a subview to the tab bar itself?
I tried this ugly code which did not even make the button show up:
for(UIView *view in self.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
[view addSubview:button];
break;
}
}
Any ideas?
UPDATE:
My solution:
In my ApplicationDelegate i define the following methods, which i call whenever needed in the viewWillAppear or viewWillDisappear methods:
-(void)hideCenterButton:(BOOL)animated
{
if(animated){
[UIView animateWithDuration:0.3
delay:0.0f
options:UIViewAnimationCurveLinear
animations:^{
CGRect frame = self.centerButton.frame;
frame.origin.x = -100;
self.centerButton.frame = frame;
}
completion:^(BOOL finished){
}];
}
}
-(void)showCenterButton:(BOOL)animated
{
if(animated){
[UIView animateWithDuration:0.35
delay:0.0f
options:UIViewAnimationCurveLinear
animations:^{
CGRect frame = self.centerButton.frame;
frame.origin.x = (self.view.superview.frame.size.width / 2) - (self.centerButton.frame.size.width / 2);
self.centerButton.frame = frame;
}
completion:^(BOOL finished){
}];
}
}
I had to set the animation's duration to 0.35s to get a smooth effect in harmony with the tab bar.
Why don't you make button your tabbar's part.
tabBarController.tabBar.addSubView(yourButton)
everything would be solve. cheers!
One easy way to handle this would be to create an instance of the button in .h of your file.
UIButton *customTabButton;
When calling the hides bottom bar on push set the button property to hidden and reset it again in the other views if the bottom bar is visible.
shareFbButton.hidden=YES;
You can check this is the viewDidLoad of all the files and put this line of code if needed to make sure you are displaying the button and hiding the button on all the pages you need.
if(self.tabBarController.tabBar.isHidden){
// set or reset the custom button visibility here
}
This is one way.
I think there are 2 ways you can got with this.
1) try to get the button into a view that is above the old top view controller and the tab bar BUT below the new top view controller that is pushed.
2) animate away the button when the new view controller is pushed.
The first will require mucking with the iOS proprietary view hierarchy which is undocumented, unsupported and could change anytime.
The second will be a matter of making the animation appear smooth enough for your user not to notice. It's not entirely a matter of behaving perfect, just appearing appropriately.
I would personally recommend an animation of the the button disappearing (animate it's alpha to 0) and reappearing based on if your view controller that goes over the tab bar is appearing or disappearing.
The animation for a navigation is (I believe) 0.3 seconds. If the button is in the middle of the tab bar, you'll likely want it invisible as the animating in view controller reaches it (if not sooner) so something between 0.1 and 0.15 seconds could be used to animate it out.
Now this does not make the button behave exactly the same as the tab bar, but with the quickness of the transition being so short, it will be unnoticeable really to the user.
Now just to provide a question for you to ask yourself. Why do you need to push a view controller that overlaps the tab bar? Why is that more desirable/necessary than presenting a modal view controller? If you can strongly argue for it, keep at it and good luck, if it's not necessary however, you may be able to achieve the experience you want with a modal view controller.
Check this one to put a button on the UITabBar. See if it works after with hidesBottoBarWhenPushed.