stefanosn
stefanosn

Reputation: 3324

UIScrollview with paging vertically working but user not landing to the next page

I am using the following code to scroll to the next page of a UITableView that has a scrollview. Scrolling works but the page the user lands to depends on the power he scrolls with his finger. Whatever the force of scrolling is it needs to land to the next page. How can i achieve this? Any help appreciated...

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint
*)targetContentOffset {
    self.tableView.rowHeight = [UIScreen mainScreen].bounds.size.height-self.navigationController.navigationBar.frame.size.height-(self.appDelegate.heightOfEightFeedWalletTopConstraint*2)+12;

    int tomove = ((int)targetContentOffset->y % (int)self.tableView.rowHeight);
    if(tomove < self.tableView.rowHeight/6 || velocity.y < 0){
            targetContentOffset->y -= tomove;
       }
        else{
            targetContentOffset->y += (self.tableView.rowHeight-tomove);
        }
}

Upvotes: 0

Views: 58

Answers (1)

DonMag
DonMag

Reputation: 77443

You don't need any of that code...

All you need to do is enable paging on the scroll view.

This will

  • create a scroll view with 20-points on all 4 sides
  • add a vertical stack view
  • add 10 labels as arranged subviews (each label will be the height of the scroll view frame)

Scroll view has paging enabled:

#import <UIKit/UIKit.h>

@interface PageScrollViewController : UIViewController
{
    UIScrollView *scrollView;
}
@end

@implementation PageScrollViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    scrollView = [UIScrollView new];
    [scrollView setPagingEnabled:YES];
    
    UIStackView *stack = [UIStackView new];
    stack.axis = UILayoutConstraintAxisVertical;
    stack.distribution = UIStackViewDistributionFillEqually;

    stack.translatesAutoresizingMaskIntoConstraints = NO;
    scrollView.translatesAutoresizingMaskIntoConstraints = NO;

    [scrollView addSubview:stack];
    [self.view addSubview:scrollView];
    
    // respect safeArea
    UILayoutGuide *g = self.view.safeAreaLayoutGuide;
    UILayoutGuide *cg = scrollView.contentLayoutGuide;
    
    [NSLayoutConstraint activateConstraints:@[
        
        [scrollView.topAnchor constraintEqualToAnchor:g.topAnchor constant:20.0],
        [scrollView.leadingAnchor constraintEqualToAnchor:g.leadingAnchor constant:20.0],
        [scrollView.trailingAnchor constraintEqualToAnchor:g.trailingAnchor constant:-20.0],
        [scrollView.bottomAnchor constraintEqualToAnchor:g.bottomAnchor constant:-20.0],
        
        [stack.topAnchor constraintEqualToAnchor:cg.topAnchor constant:0.0],
        [stack.leadingAnchor constraintEqualToAnchor:cg.leadingAnchor constant:0.0],
        [stack.trailingAnchor constraintEqualToAnchor:cg.trailingAnchor constant:0.0],
        [stack.bottomAnchor constraintEqualToAnchor:cg.bottomAnchor constant:0.0],
        
        [stack.widthAnchor constraintEqualToAnchor:scrollView.frameLayoutGuide.widthAnchor],
        
    ]];
    
    // now let's add some views to the stack view
    //  making each one the same height as the scroll view frame
    NSArray <UIColor *> *colors = @[
        UIColor.yellowColor,
        UIColor.greenColor,
        UIColor.cyanColor,
        UIColor.orangeColor,
    ];
    
    for (int i = 0; i < 10; i++) {
        UILabel *v = [UILabel new];
        v.textAlignment = NSTextAlignmentCenter;
        v.text = [NSString stringWithFormat:@"Label %d", i];
        v.backgroundColor = colors[i % colors.count];
        [stack addArrangedSubview:v];
        [v.heightAnchor constraintEqualToAnchor:scrollView.frameLayoutGuide.heightAnchor].active = YES;
    }

}

@end

Upvotes: 1

Related Questions