Добавление представлений негативным способом просмотра uiscrollview и изменение размера содержимого

У меня есть UIScrollView с календарем в нем. Теперь я хочу, чтобы 2 следующих месяца и 2 предыдущих месяца уже были загружены в представление прокрутки.

У меня есть два следующих метода.

-(void)addCalendarToEnd{
    iPhoneMonthView *phoneCal =  [[iPhoneMonthView alloc] init];
    phoneCal.delegate = self;
    phoneCal.dataSource = self;
    [phoneCal selectDate:[self sameDateByAddingMonths:1 andDate:scrollDate]];
    float xValue = phoneCal.frame.size.width * numberOfCalendarsAfterToday;
    phoneCal.frame = CGRectMake(xValue, 0, phoneCal.frame.size.width, phoneCal.frame.size.height);
    [self.calendarScroll addSubview:phoneCal];
    int numberScroll = numberOfCalendarsBeforeToday + numberOfCalendarsAfterToday + 1;
    calendarScroll.contentSize = CGSizeMake(numberScroll*phoneCal.bounds.size.width,calendarScroll.bounds.size.height);
    [calendarScroll addSubview:phoneCal];
    NSLog(@"CONTENT SIZE IS %f",calendarScroll.contentSize.width);

    numberOfCalendarsAfterToday++;

}
-(void)addCalenderToBeginning{
    iPhoneMonthView *phoneCal =  [[iPhoneMonthView alloc] init];
    phoneCal.delegate = self;
    phoneCal.dataSource = self;
    [phoneCal selectDate:[self sameDateByAddingMonths:-1 andDate:scrollDate]];
    float xValue = phoneCal.frame.size.width * numberOfCalendarsBeforeToday;
    NSLog(@"XVALUE IS %f",xValue);
    phoneCal.frame = CGRectMake(-xValue, 0, phoneCal.frame.size.width, phoneCal.frame.size.height);
    [self.calendarScroll addSubview:phoneCal];
    int numberScroll = numberOfCalendarsBeforeToday + numberOfCalendarsAfterToday + 1;
    calendarScroll.contentSize = CGSizeMake(numberScroll*phoneCal.bounds.size.width,calendarScroll.bounds.size.height);
    NSLog(@"CONTENT SIZE IS %f",calendarScroll.contentSize.width);
    numberOfCalendarsBeforeToday++;
}

addCalendarToEnd работает как надо. Но addCalendarToBeginning нет. Это добавляет вид на правильное место. Но я не знаю, как мне установить contentSize из UIScrollView,

Кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ

И это то, что я делаю в ViewDidLoad

 scrollDate = [NSDate new];    
    iPhoneMonthView *phoneCal =  [[iPhoneMonthView alloc] init];
    phoneCal.frame = CGRectMake(0, 0, phoneCal.frame.size.width, phoneCal.frame.size.height);
    phoneCal.delegate = self;
    phoneCal.dataSource = self;
    [phoneCal selectDate:[NSDate new]];
    NSLog(@"PHONE CALL HEIGHT IS %f",phoneCal.frame.size.height);
    float xValue = phoneCal.frame.size.width * numberOfCalendarsAfterToday;
    phoneCal.frame = CGRectMake(xValue, 0, phoneCal.frame.size.width, phoneCal.frame.size.height);


    calendarScroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, phoneCal.frame.size.width, phoneCal.frame.size.height)];
    calendarScroll.delegate = self;
    [calendarScroll addSubview:phoneCal];
    calendarScroll.backgroundColor = [UIColor clearColor];
    calendarScroll.contentSize =CGSizeMake(numberOfCalendarsAfterToday*phoneCal.frame.size.width,phoneCal.frame.size.height);
    calendarScroll.contentOffset = CGPointZero;

    [self.calendarView addSubview:calendarScroll];
    NSLog(@"PHONE CALL HEIGHT NOW IS %f",phoneCal.frame.size.height);


    numberOfCalendarsBeforeToday++;
    numberOfCalendarsAfterToday++;

6 ответов

Кажется, ты делаешь это сложнее, чем нужно. Если я правильно понимаю вашу проблему, вы сможете решить ее, выполнив что-то вроде этого:

-(void)viewDidLoad
{
   [super viewDidLoad];
    int numberOfMonthViews = 5;
    float monthViewWidth = 320.0f;
    float monthViewHeight = 200.0f;
    self.calendarScroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, monthViewWidth, monthViewHeight)];
    self.calendarScroll.delegate = self;
    self.calendarScroll.backgroundColor = [UIColor clearColor];

    NSDate* todayDate = [NSDate new];
    int dateOffset = -2;
    for (int i = 0; i < numberOfMonthViews; i++)
    {
         iPhoneMonthView *phoneCal =  [[iPhoneMonthView alloc] init];
         phoneCal.delegate = self;
         phoneCal.dataSource = self;
         [phoneCal selectDate:[self sameDateByAddingMonths:dateOffset andDate:todayDate]];
         float xValue = monthViewWidth * i;
         phoneCal.frame = CGRectMake(xValue, 0, monthViewWidth, monthViewHeight);
         [self.calendarScroll addSubview:phoneCal];
         calendarScroll.contentSize = CGSizeMake(xValue + monthViewWidth, monthViewHeight);
         dateOffset++;
    }

    self.calendarScroll.contentOffset = CGPoint(monthViewWidth*2, 0.0f);
}

Пожалуйста, прокомментируйте, если у вас есть какие-либо вопросы к моему решению.

Если вы хотите прокрутить только 5 месяцев, я бы предложил заполнить контент линейным способом, а затем соответствующим образом переместить смещение контента.

Так что просматривайте представления, добавляя их в представление прокрутки и корректируя происхождение кадра так, чтобы они находились на одном уровне друг с другом.

Затем настройте contentOffset так

scrollview.contentOffset.x = 3*phoneCal.frame.size.width;

Однако, если вы хотите прокрутить просмотр "бесконечной" суммы, вам следует взглянуть на такое решение, как DMCircularScrollView.

Для начала попробуйте установить смещение содержимого просмотра прокрутки:

calendarScroll.contentOffset = CGPointZero;

Вы должны играть с contentInset параметр для определения пределов прокрутки для пользователя.

Я предполагаю, что вы хотите, чтобы они пиковались только в верхнем календаре, если только они не затянутся достаточно, в какой момент вы установите contentInset.top на отрицательное число, чтобы "разблокировать" новую область прокрутки и позволить им прокручиваться дальше вверх.

В вашем addCalendarToEnd Метод, который вы добавляете phoneCal в качестве подпредставления calendarScroll сначала с self.calendarScroll и в конце calendarScroll,

И в addCalenderToBeginning метод, вы должны установить contentSize такие как..

calendarScroll.contentSize = CGSizeMake(-(numberScroll*phoneCal.bounds.size.width),calendarScroll.bounds.size.height);

ИЗДАНО:

Просто попробуйте в viewDidLoad метод

int numberScroll = numberOfCalendarsBeforeToday + numberOfCalendarsAfterToday + 1;
calendarScroll.contentSize = CGSizeMake(numberScroll*phoneCal.bounds.size.width,calendarScroll.bounds.size.height);

а также установить numberOfCalendarsBeforeToday++; в начале метода addCalenderToBeginning,

Просто попробуйте с моим приведенным выше кодом, если что-то, что вы не понимаете, поместите это здесь как комментарий.

Я бы не советовал делать это так, как вы это делаете - так как я не контролирую количество или повторное использование, вы будете создавать бесконечные календари (буквально). Я бы предложил использовать существующие решения:

https://github.com/evadne/DayFlow (бесконечный календарь)

https://github.com/caesarcat/InfinitePagingView (бесконечный UIScrollView)

Во-вторых, установка отрицательного значения для фрейма начального календаря не сработает, а просто приведет к тому, что он окажется за пределами видимых границ. Вы должны дать ему происхождение {0, 0} и шунтируйте все следующие календари, чтобы приспособить это.

Другие вопросы по тегам