MNCalendarView icon indicating copy to clipboard operation
MNCalendarView copied to clipboard

Need a delegate method to scroll to selectedDate.

Open stevewirig opened this issue 11 years ago • 7 comments

Am I missing this somewhere? I have combed through the code and am not seeing a way to dynamically scroll the calendarView.

stevewirig avatar Oct 04 '13 21:10 stevewirig

@stevewirig see the forks. I sow this feature in some one.

ghost avatar Oct 06 '13 11:10 ghost

This is what I added myself, where date is the beginning of the month that you want.

  • (void)scrollToDate:(NSDate *)date { [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:[_monthDates indexOfObject:date]] atScrollPosition:UICollectionViewScrollPositionTop animated:NO]; }

johnrickman avatar Oct 27 '13 21:10 johnrickman

Hi there,

I have added the mentioned method but am getting below crash.

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'attempt to scroll to invalid index path: <NSIndexPath: 0xb736db0> {length = 2, path = 2147483647 - 0}'

nivaskarthik avatar Dec 06 '13 07:12 nivaskarthik

I am having trouble with this as well, any updates?

mrbagels avatar Jan 05 '14 08:01 mrbagels

Corrected Answer:

[calendarView.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1] atScrollPosition:UICollectionViewScrollPositionTop animated:YES];

Pass the selected date index path.

nivaskarthik avatar Feb 11 '14 11:02 nivaskarthik

I know this is kind of old, but I found that this method works better. If you have any improvements let me know!

-(void) scrollToDate:(NSDate*) date withAnimation: (BOOL) animate{
    NSDateComponents *dateComponents = [self.calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:[NSDate date]];
    dateComponents.day = 1;
    NSDate *beginningOfMonth = [self.calendar dateFromComponents:dateComponents];

    NSInteger month = [[self.calendar components:NSCalendarUnitMonth fromDate:beginningOfMonth toDate:date options: 0] month];
    NSIndexPath* index = [NSIndexPath indexPathForItem:0 inSection:month];

    UICollectionViewLayoutAttributes *attributes = [self.collectionView layoutAttributesForItemAtIndexPath:index];
    CGRect rect = attributes.frame;
    rect.origin.y += self.bounds.size.height - 30-44;

    [self.collectionView scrollRectToVisible:rect animated:animate];
}

dehli avatar Apr 11 '14 06:04 dehli

Hello Dehli,

I happened upon your code and there is an issue when scrolling to a date that is before the visible date on screen. I have made some changes, now it will work regardless of scroll direction.

-(void) scrollToDate:(NSDate*)date animated:(BOOL)animated
{
    NSDateComponents *dateComponents = [self.calendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:self.fromDate];
    dateComponents.day = 1;
    NSDate *beginningOfMonth = [self.calendar dateFromComponents:dateComponents];

    NSInteger month = [[self.calendar components:NSCalendarUnitMonth fromDate:beginningOfMonth toDate:date options: 0] month];
    NSIndexPath* index = [NSIndexPath indexPathForItem:0 inSection:month];

    UICollectionViewLayoutAttributes *attributes = [self.collectionView layoutAttributesForItemAtIndexPath:index];
    CGRect rect = attributes.frame;

    int offset = 44;
    if ([self.collectionView contentOffset].y > rect.origin.y)
        offset -= 64;
    rect.origin.y += self.bounds.size.height - offset - 568;
    rect.size = CGSizeMake(320, 568);

    [self.collectionView scrollRectToVisible:rect animated:animated];
}

Mackarous avatar Apr 20 '14 21:04 Mackarous