读书人

那类别似toolbar可以提拖动的

发布时间: 2012-08-31 12:55:03 作者: rapoo

那种类似toolbar可以提拖动的

最开始, 是想利用toolBar来着,可惜好多原因(忘了?好像是图片要自动给你光化,如果利用custom button也有这些那些的问题, 还有就是间距什么的, 位置也不好算).

?

最终, 利用普通button + UIView + UIScrollView实现了个. 另外还悲剧的发现, 好像按钮没有长按时的那种事件..也是利用Timer自己搞.

?

?

@interface ScrollToolBar2 : UIView<UIScrollViewDelegate> {UIScrollView *buttonView;UIButton *leftButton;UIButton *rightButton;UIButton *selectedButton;int isTouchHold;NSTimer *timer;}- (id)initWithFrame:(CGRect)frame defaultClickButtonPosition:(int)pos images:(UIImage *)firstImg, ...;@end

?

#import "ScrollToolBar2.h"#define BUTTON_LEFT_SPACE 10#define BUTTON_RIGHT_SPACE 10#define BUTTON_ITEM_SPACE 10#define BUTTON_MOVE_SPACE 6@implementation ScrollToolBar2void switchBtnState(UIButton *button){UIImage *imgA = [button imageForState:UIControlStateNormal];UIImage *imgB = [button imageForState:UIControlStateHighlighted];[imgA retain];[imgB retain];[button setImage:imgB forState:UIControlStateNormal];[button setImage:imgA forState:UIControlStateHighlighted];[imgA release];[imgB release];}- (void) toggle:(UIButton *) button{if (selectedButton == button) {return;}if (selectedButton){switchBtnState(selectedButton);}selectedButton = button;switchBtnState(button);float width = buttonView.frame.size.width;CGRect rect = button.frame;float offsetCenter = buttonView.contentOffset.x + width / 2;if((rect.origin.x + rect.size.width / 2) < offsetCenter) { // button in leftfloat offset = rect.origin.x - (offsetCenter - rect.size.width / 2);CGPoint contentOffset = buttonView.contentOffset;contentOffset.x = contentOffset.x + offset;contentOffset.x = contentOffset.x < 0 ? 0 : contentOffset.x;[buttonView setContentOffset:contentOffset animated:YES];}else { //button in rightfloat offset = rect.origin.x - (offsetCenter - rect.size.width / 2);CGPoint contentOffset = buttonView.contentOffset;contentOffset.x = contentOffset.x + offset;contentOffset.x = contentOffset.x > (buttonView.contentSize.width - width) ? (buttonView.contentSize.width - width) : contentOffset.x;[buttonView setContentOffset:contentOffset animated:YES];}}- (id)initWithFrame:(CGRect)frame defaultClickButtonPosition:(int)pos images:(UIImage *)firstImg, ...{if ((self = [super initWithFrame:frame])){UIButton *defaultClickBtn = nil;isTouchHold = 0;int i = 0;float totalWidth = BUTTON_LEFT_SPACE;va_list params;va_start(params, firstImg);UIImage *now = va_arg(params,UIImage *);UIImage *prev = firstImg;NSMutableArray *buttons = [[NSMutableArray alloc] init];while(firstImg){UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];[button setImage:prev forState:UIControlStateNormal];[button setImage:now forState:UIControlStateHighlighted];[button addTarget:self action:@selector(toggle:) forControlEvents:UIControlEventTouchDown];button.frame = CGRectMake(totalWidth, 0, prev.size.width, prev.size.height);button.tag = i;if (i == pos) {defaultClickBtn = button;[defaultClickBtn retain];}totalWidth += prev.size.width + BUTTON_ITEM_SPACE;[buttons addObject:button];i++;prev = va_arg(params,UIImage *);if(prev == nil){break;}now = va_arg(params,UIImage *);}totalWidth = totalWidth - BUTTON_ITEM_SPACE + BUTTON_RIGHT_SPACE;buttonView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, frame.size.width, frame.size.height)];buttonView.pagingEnabled = NO;buttonView.contentSize = CGSizeMake(totalWidth, frame.size.height);buttonView.showsHorizontalScrollIndicator = NO;buttonView.showsVerticalScrollIndicator = NO;buttonView.scrollsToTop = NO;for(id btn in buttons){[buttonView addSubview:btn];}UIImage *leftBtnImg = [UIImage imageNamed:@"submenu_left"];leftButton = [UIButton buttonWithType:UIButtonTypeCustom];leftButton.frame = CGRectMake(0.0, 0.0, leftBtnImg.size.width, leftBtnImg.size.height);[leftButton setImage:leftBtnImg forState:UIControlStateNormal];[leftButton retain];[leftButton addTarget:self action:@selector(offsetButtonTouchBegin:) forControlEvents:UIControlEventTouchDown];[leftButton addTarget:self action:@selector(offsetButtonTouchEnd:) forControlEvents:UIControlEventTouchUpInside];[leftButton addTarget:self action:@selector(offsetButtonTouchEnd:) forControlEvents:UIControlEventTouchUpOutside];UIImage *rightBtnImg = [UIImage imageNamed:@"submenu_right"];rightButton = [UIButton buttonWithType:UIButtonTypeCustom];rightButton.frame = CGRectMake(frame.size.width - rightBtnImg.size.width, 0.0, rightBtnImg.size.width, rightBtnImg.size.height);[rightButton setImage:rightBtnImg forState:UIControlStateNormal];[rightButton retain];[rightButton addTarget:self action:@selector(offsetButtonTouchBegin:) forControlEvents:UIControlEventTouchDown];[rightButton addTarget:self action:@selector(offsetButtonTouchEnd:) forControlEvents:UIControlEventTouchUpInside];[rightButton addTarget:self action:@selector(offsetButtonTouchEnd:) forControlEvents:UIControlEventTouchUpOutside];UIImage *submenuBGImg = [UIImage imageNamed:@"submenu.png"];UIImageView *backgroundImg = [[UIImageView alloc] initWithImage:submenuBGImg];[self addSubview:backgroundImg];[self addSubview:buttonView];[self addSubview:leftButton];[self addSubview:rightButton];[self scrollViewDidEndDecelerating:buttonView ];[buttonView setDelegate:self];[backgroundImg release];[buttons release];if(defaultClickBtn) {[self toggle:defaultClickBtn];[defaultClickBtn release];}}return self;}- (void) transformation{if (!timer) return;NSNumber *number = [timer userInfo];int offset = [number intValue];CGPoint offsetPoint = buttonView.contentOffset;offsetPoint.x = offsetPoint.x + offset;if (offsetPoint.x <= 0){offsetPoint.x = 0;[timer invalidate];[timer release];timer = nil;}else if(offsetPoint.x >= (buttonView.contentSize.width - buttonView.frame.size.width)){offsetPoint.x = buttonView.contentSize.width - buttonView.frame.size.width;isTouchHold = 0;[timer invalidate];[timer release];timer = nil;}buttonView.contentOffset = offsetPoint;}- (void) startTimer:(id) sender{int space = sender == leftButton ? BUTTON_MOVE_SPACE * -1 : BUTTON_MOVE_SPACE;NSNumber *number = [[NSNumber alloc] initWithInt:space];timer = [NSTimer scheduledTimerWithTimeInterval:0.005 target:self selector:@selector(transformation) userInfo:number repeats:YES];[timer retain];[number release];}- (void) offsetButtonTouchBegin:(id) sender{isTouchHold = sender == leftButton ? -6 : 6;[self startTimer:sender];}- (void) offsetButtonTouchEnd:(id) sender{[timer invalidate];[timer release];timer = nil;isTouchHold = 0;}void changeHiddenForButton(UIButton *button, BOOL isHidden){float alpha = isHidden ? 0.0 : 1.0;if (button.alpha == alpha) return;[UIView beginAnimations: nil context:nil];[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];[UIView setAnimationDuration:1];button.alpha = alpha;[UIView commitAnimations];}- (void)scrollViewDidScroll:(UIScrollView *)scrollView{[self scrollViewDidEndDecelerating:scrollView];}- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{float offset = scrollView.contentOffset.x;if (offset <= 0){changeHiddenForButton(leftButton, YES);}else {changeHiddenForButton(leftButton, NO);}if(offset >= (scrollView.contentSize.width - scrollView.frame.size.width)){changeHiddenForButton(rightButton, YES);}else{changeHiddenForButton(rightButton, NO);}}- (void)dealloc{[buttonView release];[super dealloc];}@end
?

这下代码够完整了吧...给公司写的,但是未经过测试,保佑不被老大发现.哈哈, 其实没啥技术含量, 反正都是你抄我, 我抄你..就是计算那些坐标系很是麻烦的说..

效果图:


那类别似toolbar可以提拖动的

?

读书人网 >移动开发

热点推荐