Rectangle 27 0

In your viewDidScroll: delegate method track the contentOffset for your UITableView. You can then set the UIView's frame accordingly.

iphone - Growing header in UITableView as user pulls - Stack Overflow

iphone ios uitableview
Rectangle 27 0

I recently posted a blog post about accomplishing this using constraints which might help, turns out it was quite straight forward.

objective c - iOS: Stretching / Resizing UITableView Header As The Use...

ios objective-c uitableview uiscrollview uiimageview
Rectangle 27 0

I dont know if this would help you or not ..

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
float scrollViewHeight = scrollView.frame.size.height;
float scrollContentSizeHeight = scrollView.contentSize.height;
float scrollOffset = scrollView.contentOffset.y;

if (scrollOffset == 0)
{
    // then we are at the top
}
else if (scrollOffset + scrollViewHeight == scrollContentSizeHeight)
{
    // then we are at the end
   // Do what you need here 
}

objective c - iOS: Stretching / Resizing UITableView Header As The Use...

ios objective-c uitableview uiscrollview uiimageview
Rectangle 27 0

First of all you should remove the UIImageView from the header and add it as a simple UIImageView on top of the UITableView then since UITableViewDelegate protocol conforms to UIScrollViewDelegate protocol you can implement the scrollViewDidScroll: method to check when the tableView is scrolling down and has a bouncing effect. something like this:

-(void)someInitMethod {
   initialFrame = yourHeaderView.frame;
}
-(void)scrollViewDidScroll:(UIScrollView*)scrollView {
    if(scrollView.contentOffset.y < 0) {
       initialFrame.size.height -= scrollView.contentOffset.y;
       yourHeaderView.frame = initialFrame;
    }
}

Also make sure you set the proper contentMode for your UIImageView. Also I think this implementation will create a bouncing effect but I'm not sure because I can't test it right now but I think this is a good start point for you.

Hey Dany thanks for your time! I have followed your advice and have tried what you recommended. For some reason though, as I drag down, the image just disappears, and never returns. The bouncing effect is implemented which I like though. Any suggestions? I have updated my question to show you what I tried.

Please check the ` initialFrame.size.height -= scrollView.contentOffset.y;` I think there is a + instad of - but I'm not sure. So first check the image view frame in scrollViewDidScroll and after that if everything is correct check if there is a need for setNeedsDisplay on imageView to redraw the image.

The math is incorrect, this would make it look jerky as it keeps adding up to bigger and bigger number instead of increments of the difference.

objective c - iOS: Stretching / Resizing UITableView Header As The Use...

ios objective-c uitableview uiscrollview uiimageview
Rectangle 27 0

I recently posted a blog post about accomplishing this using constraints which might help, turns out it was quite straight forward.

That is indeed great, but it is of no use for @KingPolycon, as he is using an image at the top of a table view, and in this case it is a lot more tricky to handle - I'm still looking into it myself. Though I guess he either found a way to do it or changed drastically his approach since he posted this question :p.

@CyberDandy You are correct, the table view header view does behave differently

This is the reason one should answers along with links. The link is dead. I'm going to downvote this. It's a 7 upvotes that is worth nothing now. I'll Upvote again when the link is back up or some sort of answer is added.

You're right about posting with links, however if you really need it, here you go: web.archive.org/web/20160326225445/http://

objective c - iOS: Stretching / Resizing UITableView Header As The Use...

ios objective-c uitableview uiscrollview uiimageview
Rectangle 27 0

I don't know, if this would help you or not ..

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    float scrollViewHeight = scrollView.frame.size.height;
    float scrollContentSizeHeight = scrollView.contentSize.height;
    float scrollOffset = scrollView.contentOffset.y;

    if (scrollOffset == 0)
    {
        // then we are at the top
    }
    else if (scrollOffset + scrollViewHeight == scrollContentSizeHeight)
    {
        // then we are at the end
        // Do what you need here 
    }
}

objective c - iOS: Stretching / Resizing UITableView Header As The Use...

ios objective-c uitableview uiscrollview uiimageview
Rectangle 27 0

Please have a look at this https://github.com/matteogobbi/MGSpotyViewController which implements the same effect as per your requirement.

objective c - iOS: Stretching / Resizing UITableView Header As The Use...

ios objective-c uitableview uiscrollview uiimageview
Rectangle 27 0

Actually looks like there are a few libraries out there, and using the first table cell is not the way to go. "Parallax" seemed to be the magic google term.

iphone - Growing header in UITableView as user pulls - Stack Overflow

iphone ios uitableview
Rectangle 27 0

I know this answer is over a year late, but I wanted to state my hypothesis on it...just incase it might help someone else later. Im implementing a similar view and came to this conclusion. Anyone is welcomed to correct me if I'm wrong.

I think that perhaps the top view is a header view and the two options that seem like a collection view and a table view are both collection views.

Because the layout of collection views can be fine tuned to the most minute details, I think the view that looks like a table view is just a really specifically designed collection view. And when switching between the views, the collection view's data and properties are being swapped and reloaded.

ios - uitableview with header like instagram user profile - Stack Over...

ios uitableview uiscrollview instagram
Rectangle 27 0

This is how I achieved it, in my case I was using a map view up the top:

  • Create a View Controller in storyboard.
  • Add a Table View and set the constraints to 0 from all sides.
  • Add a Map View (or whatever view) below the Table View so that it will get rendered over the top. It will look like it is overlapping.
  • Add constraints to the top left and right.
  • In the view controller viewDidLoad add the following: tableView.contentInset = UIEdgeInsetsMake(200, 0, 0, 0) where 200 is the height of the View. This will push the contents of the table view downwards.
  • In the view controller add the following code, which resizes the view based on the scrolling: func scrollViewDidScroll(scrollView: UIScrollView) { var scrollOffset = scrollView.contentOffset.y var headerFrame = mapView.frame if (scrollOffset < 0) { // Adjust map headerFrame = CGRect(x: mapView.frame.origin.x, y: mapView.frame.origin.y, width: mapView.frame.size.width, height: -scrollOffset) } else { // Adjust map headerFrame = CGRect(x: mapView.frame.origin.x, y: mapView.frame.origin.y, width: mapView.frame.size.width, height: 0) } mapView.frame = headerFrame }
contentInset

objective c - iOS: Stretching / Resizing UITableView Header As The Use...

ios objective-c uitableview uiscrollview uiimageview
Rectangle 27 0

First of all you should remove the UIImageView from the header and add it as a simple UIImageView on top of the UITableView then since UITableViewDelegate protocol conforms to UIScrollViewDelegate protocol you can implement the scrollViewDidScroll: method to check when the tableView is scrolling down and has a bouncing effect. something like this:

-(void)someInitMethod {
   initialFrame = yourHeaderView.frame;
}
-(void)scrollViewDidScroll:(UIScrollView*)scrollView {
    if(scrollView.contentOffset.y < 0) {
       initialFrame.size.height -= scrollView.contentOffset.y;
       yourHeaderView.frame = initialFrame;
    }
}

Also make sure you set the proper contentMode for your UIImageView. Also I think this implementation will create a bouncing effect but I'm not sure because I can't test it right now but I think this is a good start point for you.

Hey Dany thanks for your time! I have followed your advice and have tried what you recommended. For some reason though, as I drag down, the image just disappears, and never returns. The bouncing effect is implemented which I like though. Any suggestions? I have updated my question to show you what I tried.

Please check the ` initialFrame.size.height -= scrollView.contentOffset.y;` I think there is a + instad of - but I'm not sure. So first check the image view frame in scrollViewDidScroll and after that if everything is correct check if there is a need for setNeedsDisplay on imageView to redraw the image.

The math is incorrect, this would make it look jerky as it keeps adding up to bigger and bigger number instead of increments of the difference.

objective c - iOS: Stretching / Resizing UITableView Header As The Use...

ios objective-c uitableview uiscrollview uiimageview
Rectangle 27 0

This is what I have. My problem is that I'm mot getting back in useful time the tableview's frame height from the tableview controller to the UserProfileViewController in order to change the latter's scrollview size. I also feel that I'm somehow doing this backwards so any suggestions are more than welcome.

This view has two parts: an upper part and a lower part. The parent view is a scroll view. What I wanted to achieve with this is having a sort of tab bar in the upper part that will controll waht will appear in the lower part.

The upper part has a flip animation when the upper left button is pressed to reveal another view. The way this is achieved is by having 2 views: a dummy view and the back view. The dummy view has the front view as a child. The front view is the one that containes all the buttons. The code for this animation is achieved in this way:

- (IBAction)infoButtonPressed:(id)sender
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.hoverView cache:YES];

    if ([self.headerView superview]) {

        [self.headerView removeFromSuperview];
        [self.hoverView addSubview:self.backOfHeaderView];
        [self.infoButton removeFromSuperview];
        [self.backOfHeaderView addSubview:self.infoButton];

    } else {

        [self.backOfHeaderView removeFromSuperview];
        [self.hoverView addSubview:self.headerView];
        [self.infoButton removeFromSuperview];
        [self.headerView addSubview:self.infoButton];

    }
    [UIView commitAnimations];
}

The lower part is made out of a container view that acts as a place holder. When a button is pressed a different view controller is displayed in the container view.

Each view controller has a container view of it's own. The specific view of that view controller (tableview) is added to it's container view when the controller is loaded. It also makes sure that if the tableview is already added to the container view it will be removed. All this is done in each specific view controller.

In the view controller of the User Profile view there is an instance of the container view and one of a UIViewController that also acts as a placeholder(named currentViewController from now on). When a specific button is pressed it checks if the an instance of the view controller that we want to display already exists. If not it will make one and will set it's tableview's frame to the bounds of the container view. After that it will remove the currentViewController's view from the superview and the currentViewController itself from the parent viewcontroller to make sure that if there is something assigned to these they will not be there. Then it goes and assigns the desired viewcontroller to the currentViewController. It also assigns the desired viewcontroller's containerView instance to the containerview in the parent viewcontroller (the User Profile viewcontroller). At the end it will add the desired viewcontroller as a child to the main viewcontroller (the User Profile viewcontroller) and desired viewcontroller's view to the containerView of the main viewcontroller. This is the code for one of the buttons:

//Check if there is an instance of the viewcontroller we want to display. If not make one and set it's tableview frame to the container's view bounds
    if(!_userWallViewController) {
        self.userWallViewController = [[WallViewController alloc] init];
//        self.userWallViewController.activityFeedTableView.frame = self.containerView.bounds;

    }

    [self.userWallViewController.containerView addSubview:self.userWallViewController.activityFeedTableView];
    //If the currentviewcontroller adn it's view are already added to the hierarchy remove them
    [self.currentViewController.view removeFromSuperview];
    [self.currentViewController removeFromParentViewController];

    //Add the desired viewcontroller to the currentviewcontroller
    self.currentViewController = self.userWallViewController;

    //Pass the data needed for the desired viewcontroller to it's instances
    self.userWallViewController.searchURLString = [NSString stringWithFormat:@"event/user/%@/", self.userID];
    self.userWallViewController.sendCommentURLString = [NSString stringWithFormat:@"event/message/%@", self.userID];

    self.userWallViewController.totalCellHeight = ^(float totalCellHeight){

        self.userWallViewController.numberOfCells = ^(float numberOfCells){
            NSLog(@"The total number of cells: %f", numberOfCells);
            NSLog(@"The total cell height: %f", totalCellHeight);

            self.scrollView.contentSize = CGSizeMake(320.0, totalCellHeight + 172.0 + 33.0);
            CGRect newFrame = self.userWallViewController.containerView.frame;
            newFrame.size.height = totalCellHeight + 33.0;
            self.userWallViewController.containerView.frame = newFrame;

            NSLog(@"Container view: %f", self.containerView.frame.size.height);
            NSLog(@"Scroll view: %f",self.scrollView.contentSize.height );
        };
    };

    //Add this containerview to the desired viewcontroller's containerView
    self.userWallViewController.containerView = self.containerView;

    //Add the needed viewcontroller and view to the parent viewcontroller and the containerview
    [self addChildViewController:self.userWallViewController];
    [self.containerView addSubview:self.userWallViewController.view];

    [self performSelector:@selector(changeScrollView) withObject:self afterDelay:0.5];

    //CLEAN UP THE CONTAINER VIEW BY REMOVING THE PREVIOUS ADDED TABLE VIEWS
    [self.userFansViewController.userSimpleTableView removeFromSuperview];
    [self.fanOfViewController.userSimpleTableView removeFromSuperview];
    [self.userPublishedMovellaListViewController.gridView removeFromSuperview];

    [self.userPublishedMovellaListViewController removeFromParentViewController];
    self.userPublishedMovellaListViewController = nil;
}

ios - uitableview with header like instagram user profile - Stack Over...

ios uitableview uiscrollview instagram
Rectangle 27 0

I believe it's a headerView on a UITableView or a UICollectionView, depending on which view mode you have selected. When you tap one of the buttons it changes out the UITableView to a UICollectionView or vice versa.

You want to keep track of the current contentOffset for whichever is being displayed (UICollectionView and UITableView are both subclasses of UIScrollView so you will be able to get this from both) and then set the contentOffset on the view you're switching to.

Setup an ivar for the UIView header subclass so you can easily re-use it.

so what you're saying is that both tableview and collectionview will have the same header and each button's action from the header will have to have the same implementation in each class? in my app I plan to have 4 buttons. Isn't that a bit of overhead?

Honestly it depends on what you're wanting to display in the four different views. You might consider a parentViewController/childViewController implementation if you're going to display several different UITableViews, but you can also try and change out the dataSource for the table views and track which mode you're in to ensure you're getting the correct amount of rows, objects, etc.

ios - uitableview with header like instagram user profile - Stack Over...

ios uitableview uiscrollview instagram
Rectangle 27 0

The earlier solutions on this page gave me some trouble when I needed this to work along with section titles and index bar, so I came up with the following alternative myself. Please note; I don't use autolayout in my project and I've only tested this on iOS9+;

  • Create a UITableView within a UIViewController (or try it with a UITableViewController).
  • Drop a UIView at the top (but within) the UITableView, so it becomes a table header above the first cell.
  • Give this header view a desired height (like 200px for example) and set the background color to "Clear Color". The Clear Color is important, the view needs to be see-through.
  • Drop a 2nd UIView within the table header UIView and make it the same size as it's parent. This will be the actual header, so feel free to give it any color, setup an image view or other content.
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Remove view from table header and place it in the background instead.
    [self.headerView removeFromSuperview];
    UIView *backgroundView = [UIView new];
    [backgroundView addSubview:self.headerView];
    self.tableView.backgroundView = backgroundView;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    /* Set initialScrollOffset ivar to start offset, because in my case
       the scroll offset was affected by the statusbar + navigation bar heights
       and the view controller's "extend edges under top bars" option. */
    initialScrollOffset = self.tableView.contentOffset.y;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    /* Modify headerView height only if the table content gets pulled
       beyond initial offset. */
    if (scrollView.contentOffset.y < initialScrollOffset) {
        CGRect frame = self.headerView.frame;
        frame.size.height = self.tableView.tableHeaderView.frame.size.height + -scrollView.contentOffset.y;
        self.headerView.frame = frame;
    }
}

I needed this implementation only for a stretching header with background color and labels. It should be easy to add a UIImageView to this header though.

Also, steps 1 to 5 are completely optional of course. You can programmatically create your header view or use a XIB instead. As long as you make sure the table has a Clear Colored header view set with the same height as your desired header because this serves as a spacer to keep your cells and section titles in line.

  • Build up your table header in interface builder as described above: 1 UIView as container with a 2nd UIView embedded within.
  • Skip the viewDidLoad code above, there is no need to pull the UIView out of it's container and we won't need to set it as a table background.
scrollViewDidScroll:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
      if (scrollView.contentOffset.y < initialScrollOffset) {
           CGRect frame = self.headerView.frame;
           frame.size.height = self.tableView.tableHeaderView.frame.size.height - scrollView.contentOffset.y;
           frame.origin.y = self.tableView.tableHeaderView.frame.origin.y + scrollView.contentOffset.y;
           self.headerView.frame = frame;
    }
}

That's it. Only visual difference from the other solution is that the contents will now scroll up along with the rest of the cells instead of being overlapped by them.

objective c - iOS: Stretching / Resizing UITableView Header As The Use...

ios objective-c uitableview uiscrollview uiimageview