Добавление представлений негативным способом просмотра 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}
и шунтируйте все следующие календари, чтобы приспособить это.