`

那种类似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 ScrollToolBar2
void 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 left
		float 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 right
		float 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
 

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

效果图:


 

  • 大小: 12.6 KB
分享到:
评论

相关推荐

    ToolBar在Toolbartray中的拖动

    在Windows系统中,我们经常看到任务栏右下角的通知区域,那里就是`ToolbarTray`的一个典型应用,它可以将`ToolBar`停靠在屏幕边缘,或者允许用户自由拖动,实现浮动效果。`ToolbarTray`的使用可以使得`ToolBar`控件...

    ToolBarDialogDragging.rar基于Dialog的toolbar拖动功能

    在本文中,我们将深入探讨如何实现一个基于Dialog的toolbar拖动功能,以及在这个过程中涉及到的相关技术。这个项目名为"ToolBarDialogDragging",它允许用户自由地拖动toolbar,并且按钮支持贴图处理,图片和文字...

    iPhone toolbar拖拽效果 代码实例

    本示例专注于“iPhone toolbar拖拽效果”,这是一项增强用户体验的技术,允许用户通过手势直接拖动工具栏上的图标,从而实现功能切换或操作。在iOS应用中,这种效果可以增加用户的参与度和应用的易用性。 首先,...

    ToolBar居中添加控件

    在Android开发中,`ToolBar`是App界面设计中常用的一个组件,它作为Activity或Fragment的顶部栏,可以提供导航、菜单和其他操作。本教程将详细讲解如何在`ToolBar`中居中添加自定义控件,以提升应用界面的美观度和...

    toolbar示范_VB6.0的toolbar使用示范_

    2. 从工具箱中拖拽一个`Toolbar`控件到窗体上,你可以通过调整其大小和位置来适应窗体设计。 3. 在属性窗口中,可以设置`Toolbar`的各种属性,如前文所述的`ButtonWidth`、`ButtonHeight`等。 4. 添加按钮:点击`...

    Android自定义toolbar布局

    在XML布局文件中,我们可以这样定义一个`Toolbar`: ```xml &lt;androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize...

    toolbar

    通过设置`CollapsingToolbarLayout`,我们可以实现类似Google Play商店那样的头部动态效果。 总之,`Toolbar`是一个高度可定制的组件,提供了丰富的功能和设计可能性。通过理解和熟练运用`Toolbar`,开发者可以打造...

    Collapsing Toolbars-可以伸缩的ToolBar

    在Android开发中,Collapsing Toolbar是Android设计支持库提供的一种功能强大的布局组件,它允许ToolBar在用户滚动视图时动态地改变其高度和可见性,从而实现类似iOS中的Parallax效果,为应用添加丰富的视觉体验。...

    ToolbarDemo 事项toolbar功能

    同时,通过结合使用`PopupMenu`,开发者可以轻松实现类似下拉菜单的功能,提升应用的交互体验。在实际项目中,开发者还可以根据需求进一步扩展`Toolbar`的功能,如添加自定义视图、动画效果等。

    Toolbar、TabLayout、AppBarLayout和RecyclerView组合可以滑动收起或显示Toolbar的demo

    标题中的“Toolbar、TabLayout、AppBarLayout和RecyclerView组合可以滑动收起或显示Toolbar的demo”涉及了Android应用开发中的几个关键组件和技术。在Android应用设计中,这些组件经常被用来构建用户友好的界面,...

    bitmap类型的toolbar

    在拖动过程中,需要更新toolbar的位置,并在鼠标释放时结束拖动。这通常涉及到复杂的坐标计算和消息响应,确保toolbar在屏幕上的位置正确更新。 总结来说,创建bitmap类型的toolbar并实现其可移动性涉及以下步骤: ...

    仿今日头条的ToolBar

    1. **ToolBar基本使用**:ToolBar是Android Support Library中的一个组件,继承自android.widget.Toolbar,它可以替代传统的ActionBar,并提供了更多的自定义可能性。使用ToolBar需要在布局文件中添加控件,然后在...

    ToolBar上添加滚动条和下拉框

    而在Web开发中,例如`HTML5`,可以使用`&lt;toolbar&gt;`或自定义CSS样式来创建类似的效果。 接下来,我们讨论如何在`ToolBar`上添加滚动条。滚动条是一种允许用户查看和浏览超出屏幕可视区域的内容的控件。在`ToolBar`中...

    C#实现toolbar示例程序

    在"ToolbarDemo"的源代码中,你可能会看到类似以下的代码片段: ```csharp private void toolStripButton1_Click(object sender, EventArgs e) { // 打开新窗口的代码 Form2 newForm = new Form2(); newForm....

    TOOLBAR

    在微软的开发框架如.NET Framework中,可以使用Windows Forms或WPF等技术来创建树型菜单TOOLBAR。这些框架提供了丰富的控件和事件处理机制,使得开发过程相对简单。 综上所述,微软树型菜单TOOLBAR是用户界面设计...

    ToolBar的Demo实战

    在Android开发中,ToolBar主要作为布局的顶部元素,可以承载应用图标、标题、菜单项等,为用户提供导航和操作。它的使用主要包括以下几个步骤: 1. 引入依赖:在项目的build.gradle模块文件中添加对Android Design ...

    Toolbar基本使用及Toolbar+ListView实现滑动变色

    总结:通过上述步骤,我们不仅可以了解Toolbar的基本使用,如设置标题、图标以及自定义样式,还可以实现一个高级功能——结合ListView实现滑动变色效果。这种效果可以提升用户的交互体验,让应用看起来更加生动和...

    VB中ToolBar的使用

    相比于之前版本中需要手动构建工具条的方式,使用Toolbar控件可以更轻松地实现类似Word 7.0风格的工具条。 ##### 1. 添加Toolbar到工具箱 - **步骤**:首先需要通过Project菜单下的Components命令将Toolbar添加到...

    toolbar实例程序(两种动态创建toolbar的方法,还有带提示的toolbar)

    在Android开发中,Toolbar作为Action Bar的...同时,了解如何在Toolbar上添加交互元素,如提示信息,可以提升用户体验,使应用更加友好。通过深入学习和实践这些示例,开发者将更好地掌握Android UI设计中的关键技巧。

    一个类似Vista的ToolBar

    总结,"一个类似Vista的ToolBar"项目涉及到前端开发中的CSS布局、视觉特效、响应式设计、交互实现等多个关键知识点,展示了如何使用现代Web技术构建出美观且功能丰富的用户界面。通过学习和实践此类项目,开发者可以...

Global site tag (gtag.js) - Google Analytics