8000 PagerView支持左右留边 · newcoderzhang/LuaViewSDK@d61aa92 · GitHub
[go: up one dir, main page]

Skip to content

Commit d61aa92

Browse files
author
城西
committed
PagerView支持左右留边
1 parent 9574a44 commit d61aa92

File tree

2 files changed

+99
-31
lines changed

2 files changed

+99
-31
lines changed

IOS/LuaViewSDK/Classes/lvsdk/LVPagerView.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#import "LVHeads.h"
1111

1212
@class LVPagerIndicator;
13-
@interface LVPagerView : UIScrollView<LVProtocal, LVClassProtocal, UIScrollViewDelegate>
13+
@interface LVPagerView : UIView<LVProtocal, LVClassProtocal, UIScrollViewDelegate>
1414

1515

1616
@property(nonatomic,weak) LView* lv_lview;

IOS/LuaViewSDK/Classes/lvsdk/LVPagerView.m

Lines changed: 98 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ @interface LVPagerView ()
4848
@property (nonatomic,assign) CGPoint nextOffset;
4949
@property (nonatomic,assign) BOOL looping;
5050
@property (nonatomic,assign) NSInteger isScrollEndTimes;
51+
52+
@property (nonatomic,strong) UIScrollView *scrollview;
53+
@property (nonatomic,assign) CGFloat sideLeft;
54+
@property (nonatomic,assign) CGFloat sideRight;
5155
@end
5256

5357

@@ -59,11 +63,21 @@ -(id) init:(lv_State*) l {
5963
self.lv_lview = (__bridge LView *)(l->lView);
6064
self.backgroundColor = [UIColor clearColor];
6165
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;
6580
self.pageIdx = 0;
66-
self.scrollsToTop = NO;
6781
self.isScrollEndTimes = 0;
6882
}
6983
return self;
@@ -112,39 +126,45 @@ -(NSInteger) xindex2index:(NSInteger) i{
112126
}
113127

114128
-(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+
}
115135
NSUInteger count = self.cellArray.count;
116-
CGSize size = self.frame.size;
136+
CGSize size = self.scrollview.frame.size;
117137
for( NSUInteger i=0; i<count; i++ ) {
118138
UIView* view = self.cellArray[i];
119139
CGFloat xIndex = [self index2xindex:i];
120140
CGFloat x = xIndex*size.width;
121141
view.frame = CGRectMake(x, 0, size.width, size.height);
122142
}
123-
self.contentSize = CGSizeMake( count * size.width, 0);
143+
self.scrollview.contentSize = CGSizeMake( count * size.width, 0);
124144
}
125145

126146
-(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;
129149
if( self.looping ) {
130150
if( self.cellArray.count>2 ) {
131-
if( p.x<=0 ) {
151+
if( p.x < width*0.5 ) {
132152
self.pageIdx0 += 1;
133-
self.contentOffset = CGPointMake( p.x + width, 0);
153+
self.scrollview.contentOffset = CGPointMake( p.x + width, 0);
134154
[self resetCellFrame];
135-
} else if( p.x>=width*2 ){
155+
} else if( p.x> width*1.5 ){
136156
self.pageIdx0 -= 1;
137-
self.contentOffset = CGPointMake( p.x - width, 0);
157+
self.scrollview.contentOffset = CGPointMake( p.x - width, 0);
138158
[self resetCellFrame];
139159
}
140160
} else {
141-
if( p.x<=0 ) {
161+
if( p.x< 0 ) {
142162
self.pageIdx0 += 1;
143-
self.contentOffset = CGPointMake( p.x + width, 0);
163+
self.scrollview.contentOffset = CGPointMake( p.x + width, 0);
144164
[self resetCellFrame];
145165
} else if( p.x>=width ){
146166
self.pageIdx0 -= 1;
147-
self.contentOffset = CGPointMake( p.x - width, 0);
167+
self.scrollview.contentOffset = CGPointMake( p.x - width, 0);
148168
[self resetCellFrame];
149169
}
150170
}
@@ -157,17 +177,19 @@ -(void) setFrame:(CGRect)frame{
157177
}
158178

159179
-(void) checkCellVisible{
160-
CGPoint p = self.contentOffset;
161-
CGRect r0 = self.bounds;
180+
CGPoint p = self.scrollview.contentOffset;
181+
CGRect r0 = self.scrollview.bounds;
162182
r0.origin = p;
183+
r0.origin.x -= self.sideLeft;
184+
r0.size.width += self.sideLeft + self.sideRight;
163185
for( int i=0; i<self.cellArray.count; i++ ){
164186
UIView* view = self.cellArray[i];
165187
if( view ) {
166188
CGRect r = view.frame;
167189
if( CGRectIntersectsRect(r, r0) ){
168-
if( view.superview!= self ) {
190+
if( view.superview!= self.scrollview ) {
169191
[self cellLayoutAtPageIdx:i];
170-
[self addSubview:view];
192+
[self.scrollview addSubview:view];
171193
}
172194
} else {
173195
[view removeFromSuperview];
@@ -178,7 +200,6 @@ -(void) checkCellVisible{
178200

179201
-(void) layoutSubviews{
180202
[super layoutSubviews];
181-
182203
[self moveCenter];
183204
[self checkCellVisible];
184205

@@ -293,11 +314,11 @@ -(void) setIndicator:(LVPagerIndicator*) indicator{
293314
}
294315

295316
-(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 ;
297318
if( offsetX<=0 ){
298319
offsetX = 0;
299320
}
300-
float maxOffset = self.contentSize.width - self.frame.size.width;
321+
float maxOffset = self.scrollview.contentSize.width - self.scrollview.frame.size.width;
301322
if( offsetX > maxOffset ){
302323
offsetX = maxOffset;
303324
}
@@ -312,12 +333,12 @@ -(void) setCurrentPageIdx:(NSInteger) pageIdx animation:(BOOL) animation{
312333

313334
// 有动画
314335
-(void) changeOffsetWithAnimation:(NSNumber*) value{
315-
[self setContentOffset:self.nextOffset animated:YES];
336+
[self.scrollview setContentOffset:self.nextOffset animated:YES];
316337
}
317338

318339
// 无动画
319340
-(void) changeOffsetNoAnimation:(NSNumber*) value{
320-
[self setContentOffset:self.nextOffset animated:NO];
341+
[self.scrollview setContentOffset:self.nextOffset animated:NO];
321342
}
322343

323344
#pragma -mark lvNewCollectionView
@@ -480,8 +501,8 @@ - (void) startTimer:(NSTimeInterval) interval repeat:(BOOL) repeat{
480501
- (void) scrollTimer:(NSTimer *) timer {
481502
if( self.isScrollEndTimes>1 ) {
482503
//更改方向
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;
485506
p.x += width;
486507
p.x = ((NSInteger)p.x) /width * width;
487508
self.nextOffset = p;
@@ -526,6 +547,26 @@ static int indicator(lv_State *L) {
526547
return 0;
527548
}
528549

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+
529570
#pragma -mark __gc
530571
static void releaseUserDataView(LVUserDataInfo* userdata){
531572
if( userdata && userdata->object ){
@@ -556,6 +597,9 @@ +(int) lvClassDefine:(lv_State *)L globalName:(NSString*) globalName{
556597
{"autoScroll", autoScroll},
557598
{"looping", looping},
558599
{"indicator", indicator},
600+
601+
{"previewSide", previewSide},
602+
559603
{"__gc", __gc },
560604
{NULL, NULL}
561605
};
@@ -573,8 +617,8 @@ +(int) lvClassDefine:(lv_State *)L globalName:(NSString*) globalName{
573617

574618

575619
- (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;
578622
CGFloat pageIndex = offsetX/pageWidth;
579623

580624
self.pageIdx = [self xindex2index:pageIndex];
@@ -598,8 +642,8 @@ - (void) callLuaWithScrolling{
598642

599643
- (void) callLuaWithScrollEnded{
600644
{
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;
603647
CGFloat pageIndex = offsetX/pageWidth;
604648

605649
self.pageIdx = [self xindex2index:pageIndex + 0.1];
@@ -618,6 +662,9 @@ - (void) callLuaWithScrollEnded{
618662
}
619663

620664
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
665+
[self moveCenter];
666+
[self checkCellVisible];
667+
621668
[self callLuaWithScrolling];
622669
}
623670

@@ -640,6 +687,27 @@ - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
640687
[self callLuaWithScrollEnded];
641688
}
642689

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+
643711
-(NSString*) description{
644712
return [NSString stringWithFormat:@"<PagerView(0x%x) frame = %@>", (int)[self hash], NSStringFromCGRect(self.frame) ];
645713
}

0 commit comments

Comments
 (0)
0