@@ -48,6 +48,10 @@ @interface LVPagerView ()
48
48
@property (nonatomic ,assign ) CGPoint nextOffset;
49
49
@property (nonatomic ,assign ) BOOL looping;
50
50
@property (nonatomic ,assign ) NSInteger isScrollEndTimes;
51
+
52
+ @property (nonatomic ,strong ) UIScrollView *scrollview;
53
+ @property (nonatomic ,assign ) CGFloat sideLeft;
54
+ @property (nonatomic ,assign ) CGFloat sideRight;
51
55
@end
52
56
53
57
@@ -59,11 +63,21 @@ -(id) init:(lv_State*) l {
59
63
self.lv_lview = (__bridge LView *)(l->lView );
60
64
self.backgroundColor = [UIColor clearColor ];
61
65
self.cellArray = [[NSMutableArray alloc ] init ];
62
- self.pagingEnabled = YES ;
63
- self.showsHorizontalScrollIndicator = NO ;
64
- self.delegate = self;
66
+ self.scrollview = ({
67
+ UIScrollView *scroll = [[UIScrollView alloc ] initWithFrame: CGRectMake (0 , 0 , 0 , 0 )];
68
+ scroll.pagingEnabled = YES ;
69
+ scroll.clipsToBounds = NO ;
70
+ scroll;
71
+ }) ;
72
+
73
+ [self addSubview: self .scrollview];
74
+ self.clipsToBounds = YES ;
75
+
76
+ self.scrollview .pagingEnabled = YES ;
77
+ self.scrollview .showsHorizontalScrollIndicator = NO ;
78
+ self.scrollview .delegate = self;
79
+ self.scrollview .scrollsToTop = NO ;
65
80
self.pageIdx = 0 ;
66
- self.scrollsToTop = NO ;
67
81
self.isScrollEndTimes = 0 ;
68
82
}
69
83
return self;
@@ -112,39 +126,45 @@ -(NSInteger) xindex2index:(NSInteger) i{
112
126
}
113
127
114
128
-(void ) resetCellFrame {
129
+ {// ScrollView的滚动大小
130
+ CGRect rect = self.bounds ;
131
+ rect.origin .x = self.sideLeft ;
132
+ rect.size .width -= self.sideLeft + self.sideRight ;
133
+ self.scrollview .frame = rect;
134
+ }
115
135
NSUInteger count = self.cellArray .count ;
116
- CGSize size = self.frame .size ;
136
+ CGSize size = self.scrollview . frame .size ;
117
137
for ( NSUInteger i=0 ; i<count; i++ ) {
118
138
UIView* view = self.cellArray [i];
119
139
CGFloat xIndex = [self index2xindex: i];
120
140
CGFloat x = xIndex*size.width ;
121
141
view.frame = CGRectMake (x, 0 , size.width , size.height );
122
142
}
123
- self.contentSize = CGSizeMake ( count * size.width , 0 );
143
+ self.scrollview . contentSize = CGSizeMake ( count * size.width , 0 );
124
144
}
125
145
126
146
-(void ) moveCenter {
127
- CGFloat width = self.bounds .size .width ;
128
- CGPoint p = self.contentOffset ;
147
+ CGFloat width = self.scrollview . bounds .size .width ;
148
+ CGPoint p = self.scrollview . contentOffset ;
129
149
if ( self.looping ) {
130
150
if ( self.cellArray .count >2 ) {
131
- if ( p.x <= 0 ) {
151
+ if ( p.x < width* 0.5 ) {
132
152
self.pageIdx0 += 1 ;
133
- self.contentOffset = CGPointMake ( p.x + width, 0 );
153
+ self.scrollview . contentOffset = CGPointMake ( p.x + width, 0 );
134
154
[self resetCellFrame ];
135
- } else if ( p.x >= width*2 ){
155
+ } else if ( p.x > width*1.5 ){
136
156
self.pageIdx0 -= 1 ;
137
- self.contentOffset = CGPointMake ( p.x - width, 0 );
157
+ self.scrollview . contentOffset = CGPointMake ( p.x - width, 0 );
138
158
[self resetCellFrame ];
139
159
}
140
160
} else {
141
- if ( p.x <= 0 ) {
161
+ if ( p.x < 0 ) {
142
162
self.pageIdx0 += 1 ;
143
- self.contentOffset = CGPointMake ( p.x + width, 0 );
163
+ self.scrollview . contentOffset = CGPointMake ( p.x + width, 0 );
144
164
[self resetCellFrame ];
145
165
} else if ( p.x >=width ){
146
166
self.pageIdx0 -= 1 ;
147
- self.contentOffset = CGPointMake ( p.x - width, 0 );
167
+ self.scrollview . contentOffset = CGPointMake ( p.x - width, 0 );
148
168
[self resetCellFrame ];
149
169
}
150
170
}
@@ -157,17 +177,19 @@ -(void) setFrame:(CGRect)frame{
157
177
}
158
178
159
179
-(void ) checkCellVisible {
160
- CGPoint p = self.contentOffset ;
161
- CGRect r0 = self.bounds ;
180
+ CGPoint p = self.scrollview . contentOffset ;
181
+ CGRect r0 = self.scrollview . bounds ;
162
182
r0.origin = p;
183
+ r0.origin .x -= self.sideLeft ;
184
+ r0.size .width += self.sideLeft + self.sideRight ;
163
185
for ( int i=0 ; i<self.cellArray .count ; i++ ){
164
186
UIView* view = self.cellArray [i];
165
187
if ( view ) {
166
188
CGRect r = view.frame ;
167
189
if ( CGRectIntersectsRect (r, r0) ){
168
- if ( view.superview != self ) {
190
+ if ( view.superview != self. scrollview ) {
169
191
[self cellLayoutAtPageIdx: i];
170
- [self addSubview: view];
192
+ [self .scrollview addSubview: view];
171
193
}
172
194
} else {
173
195
[view removeFromSuperview ];
@@ -178,7 +200,6 @@ -(void) checkCellVisible{
178
200
179
201
-(void ) layoutSubviews {
180
202
[super layoutSubviews ];
181
-
182
203
[self moveCenter ];
183
204
[self checkCellVisible ];
184
205
@@ -293,11 +314,11 @@ -(void) setIndicator:(LVPagerIndicator*) indicator{
293
314
}
294
315
295
316
-(void ) setCurrentPageIdx : (NSInteger ) pageIdx animation : (BOOL ) animation {
296
- float offsetX = [self index2xindex: pageIdx] * self.frame .size .width ;
317
+ float offsetX = [self index2xindex: pageIdx] * self.scrollview . frame .size .width ;
297
318
if ( offsetX<=0 ){
298
319
offsetX = 0 ;
299
320
}
300
- float maxOffset = self.contentSize .width - self.frame .size .width ;
321
+ float maxOffset = self.scrollview . contentSize .width - self. scrollview .frame .size .width ;
301
322
if ( offsetX > maxOffset ){
302
323
offsetX = maxOffset;
303
324
}
@@ -312,12 +333,12 @@ -(void) setCurrentPageIdx:(NSInteger) pageIdx animation:(BOOL) animation{
312
333
313
334
// 有动画
314
335
-(void ) changeOffsetWithAnimation : (NSNumber *) value {
315
- [self setContentOffset: self .nextOffset animated: YES ];
336
+ [self .scrollview setContentOffset: self .nextOffset animated: YES ];
316
337
}
317
338
318
339
// 无动画
319
340
-(void ) changeOffsetNoAnimation : (NSNumber *) value {
320
- [self setContentOffset: self .nextOffset animated: NO ];
341
+ [self .scrollview setContentOffset: self .nextOffset animated: NO ];
321
342
}
322
343
323
344
#pragma -mark lvNewCollectionView
@@ -480,8 +501,8 @@ - (void) startTimer:(NSTimeInterval) interval repeat:(BOOL) repeat{
480
501
- (void ) scrollTimer : (NSTimer *) timer {
481
502
if ( self.isScrollEndTimes >1 ) {
482
503
// 更改方向
483
- NSInteger width = self.frame .size .width ;
484
- CGPoint p = self.contentOffset ;
504
+ NSInteger width = self.scrollview . frame .size .width ;
505
+ CGPoint p = self.scrollview . contentOffset ;
485
506
p.x += width;
486
507
p.x = ((NSInteger )p.x ) /width * width;
487
508
self.nextOffset = p;
@@ -526,6 +547,26 @@ static int indicator(lv_State *L) {
526
547
return 0 ;
527
548
}
528
549
550
+ static int previewSide (lv_State *L) {
551
+ LVUserDataInfo * user = (LVUserDataInfo *)lv_touserdata (L, 1 );
552
+ if ( user ){
553
+ LVPagerView* pagerview = (__bridge LVPagerView *)(user->object );
554
+ if ( lv_gettop (L)>=3 ) {
555
+ CGFloat sideLeft = lv_tonumber (L, 2 );
556
+ CGFloat sideRight = lv_tonumber (L, 3 );
557
+ pagerview.sideLeft = sideLeft;
558
+ pagerview.sideRight = sideRight;
559
+ pagerview.frame = pagerview.frame ;
560
+ return 0 ;
561
+ } else {
562
+ lv_pushnumber (L, pagerview.sideLeft );
563
+ lv_pushnumber (L, pagerview.sideRight );
564
+ return 2 ;
565
+ }
566
+ }
567
+ return 0 ;
568
+ }
569
+
529
570
#pragma -mark __gc
530
571
static void releaseUserDataView (LVUserDataInfo* userdata){
531
572
if ( userdata && userdata->object ){
@@ -556,6 +597,9 @@ +(int) lvClassDefine:(lv_State *)L globalName:(NSString*) globalName{
556
597
{" autoScroll" , autoScroll},
557
598
{" looping" , looping},
558
599
{" indicator" , indicator},
600
+
601
+ {" previewSide" , previewSide},
602
+
559
603
{" __gc" , __gc },
560
604
{NULL , NULL }
561
605
};
@@ -573,8 +617,8 @@ +(int) lvClassDefine:(lv_State *)L globalName:(NSString*) globalName{
573
617
574
618
575
619
- (void ) callLuaWithScrolling {
576
- CGFloat offsetX = self.contentOffset .x ;
577
- CGFloat pageWidth = self.frame .size .width ;
620
+ CGFloat offsetX = self.scrollview . contentOffset .x ;
621
+ CGFloat pageWidth = self.scrollview . frame .size .width ;
578
622
CGFloat pageIndex = offsetX/pageWidth;
579
623
580
624
self.pageIdx = [self xindex2index: pageIndex];
@@ -598,8 +642,8 @@ - (void) callLuaWithScrolling{
598
642
599
643
- (void ) callLuaWithScrollEnded {
600
644
{
601
- CGFloat offsetX = self.contentOffset .x ;
602
- CGFloat pageWidth = self.frame .size .width ;
645
+ CGFloat offsetX = self.scrollview . contentOffset .x ;
646
+ CGFloat pageWidth = self.scrollview . frame .size .width ;
603
647
CGFloat pageIndex = offsetX/pageWidth;
604
648
605
649
self.pageIdx = [self xindex2index: pageIndex + 0.1 ];
@@ -618,6 +662,9 @@ - (void) callLuaWithScrollEnded{
618
662
}
619
663
620
664
- (void )scrollViewDidScroll : (UIScrollView *)scrollView {
665
+ [self moveCenter ];
666
+ [self checkCellVisible ];
667
+
621
668
[self callLuaWithScrolling ];
622
669
}
623
670
@@ -640,6 +687,27 @@ - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
640
687
[self callLuaWithScrollEnded ];
641
688
}
642
689
690
+ - (UIView *)hitTest : (CGPoint)point withEvent : (UIEvent *)event
691
+ {
692
+ UIView *view = [super hitTest: point withEvent: event];
693
+ if ([view isEqual: self ])
694
+ {
695
+ UIScrollView* scrollview = self.scrollview ;
696
+ for (UIView *subview in scrollview.subviews )
697
+ {
698
+ CGPoint offset = CGPointMake (point.x - scrollview.frame .origin .x + scrollview.contentOffset .x - subview.frame .origin .x ,
699
+ point.y - scrollview.frame .origin .y + scrollview.contentOffset .y - subview.frame .origin .y );
700
+
701
+ if ((view = [subview hitTest: offset withEvent: event]))
702
+ {
703
+ return view;
704
+ }
705
+ }
706
+ return scrollview;
707
+ }
708
+ return view;
709
+ }
710
+
643
711
-(NSString *) description {
644
712
return [NSString stringWithFormat: @" <PagerView(0x%x ) frame = %@ >" , (int )[self hash ], NSStringFromCGRect(self .frame) ];
645
713
}
0 commit comments