以uiscrollview的负面方式添加视图并更改内容

时间:2014-05-31 08:16:36

标签: ios objective-c uiscrollview uiscrollviewdelegate

我有UIScrollView,其中包含calendarView。我现在想要的是滚动视图中已经加载了下个月和前两个月。

我有以下两种方法。

-(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不是。{1}}。 它在正确的位置添加视图。但我不知道如何设置contentSize的{​​{1}}。

有人能帮助我吗?

修改

这就是我在ViewDidLoad中所做的事情

UIScrollView

6 个答案:

答案 0 :(得分:1)

如果您只想滚动浏览5个月,那么我建议您以线性方式填充内容,然后适当地移动内容偏移量。

因此,循环浏览视图,将它们添加到滚动视图并调整框架的原点,使它们彼此齐平。

然后调整contentOffset

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

但是,如果你想滚动查看"无限"您应该查看DMCircularScrollView

等解决方案的金额

答案 1 :(得分:1)

看起来你正在努力使它变得更加困难。如果我理解你的问题,你应该能够通过这样的方式来解决你的问题:

-(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);
}

如果您对我的解决方案有任何疑问,请发表评论。

答案 2 :(得分:0)

For Begin尝试设置滚动视图内容偏移量:

calendarScroll.contentOffset = CGPointZero;

答案 3 :(得分:0)

我不建议你按照这样做的方式做到这一点 - 事实上,我似乎无法控制数量或重用,你将创造无限的日历(字面意思)。我建议利用现有的解决方案:

https://github.com/evadne/DayFlow(无限日历)

https://github.com/caesarcat/InfinitePagingView(无限UIScrollView)

其次,为起始日历的帧设置负值将不起作用,它只会导致它在可见边界之外。你必须给它{0, 0}的原点并分流所有以下日历以容纳它。

答案 4 :(得分:0)

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

如果您不理解任何事情,请尝试使用我的上述代码,然后将其作为评论。

答案 5 :(得分:0)

您必须使用contentInset参数来定义用户的滚动限制。

我想你只想让它们在顶部日历中达到峰值,除非它们拖得足够,此时你将contentInset.top设置为负数,以及#34;解锁&#34;一个新的滚动区域,让它们向上滚动。