マーキーバーの効果を持つスクロールバーは、通常、iOS アプリの底部に表示されます。これは、動的に変化する情報や長いコンテンツを表示するために使用されます。以下に、使用できる 2 つのマーキーバーの実装方法を示します。
- ViewController 内で UIView の位置を定期的に移動させることで実現します。以下のコードを ViewController に直接追加し、viewWillAppear で loadView を呼び出すだけです。
- (void)marqueeView
{
CGRect frame = self.vMarqueeContainer.frame;
frame.origin.x = frame.origin.x -2;
if(frame.origin.x < -frame.size.width )
{
frame.origin.x = 320;
}
self.vMarqueeContainer.frame = frame;
//遅延再帰呼び出し
[self performSelector:@selector(marqueeView) withObject:nil afterDelay:0.04];
}
- (void)loadView
{
//マーキーバーの背景、位置、高さなどの制御
UIView *viewMarqueeBar = [[[UIView alloc]initWithFrame:CGRectMake(0, 347, 320, 20)]autorelease];
[viewMarqueeBar setBackgroundColor:[UIColor darkGrayColor]];
//スクロールコンテナ、スクロール範囲を表示
UIView *viewMarqueeContainer = [[[UIView alloc]initWithFrame:CGRectMake(320, 3, 360, 14)]autorelease];
[viewMarqueeContainer setBackgroundColor:[UIColor clearColor]];
[viewMarqueeContainer setClipsToBounds:YES];
[viewMarqueeContainer setOpaque:YES];
//コンテンツ
UILabel *lblContent = [[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 50,14)]autorelease];
[lblContent setText:@"ここにスクロールバーがあります。。。。。"];
[lblContent setTextColor:[UIColor whiteColor]];
[lblContent setBackgroundColor:[UIColor clearColor]];
[lblContent setFont:[UIFont fontWithName:@"Helvetica" size:12]];
[lblContent setOpaque:YES];
self.view= viewMarqueeBar;
self.vMarqueeContainer = viewMarqueeContainer;
[self.view addSubview:viewMarqueeContainer];
[self marqueeView];
}
2. スクロールバーコントロールを独自に定義し、ビューを自動的にスクロールさせることで、相互にメソッドを呼び出すことによってループスクロールを実現します。UIMarqueeBarView.h を定義します。
/**
* UIMarqueeBarView.h
*/
@interface UIMarqueeBarView : UIView
{
}
- (void)start;
- (void)stop;
@end
UIMarqueeBarView.m を実装します。
/**
* UIMarqueeBarView.m
*/
#import "UIMarqueeBarView.h"
@implementation UIMarqueeBarView
- (void)dealloc
{
[super dealloc];
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// 初期化コード
[self setupView];
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder {
if( (self = [super initWithCoder:aDecoder]) ) {
// 初期化コード
[self setupView];
}
return self;
}
- (void)setupView
{
[self setBackgroundColor:[UIColor lightGrayColor]];
[self setClipsToBounds:YES];
[self setOpaque:YES];
UILabel *lblContent = [[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 150 ,16)]autorelease];
[lblContent setText:@"ここにスクロールバーがあります。。。。。"];
[lblContent setTextColor:[UIColor whiteColor]];
[lblContent setBackgroundColor:[UIColor clearColor]];
[lblContent setFont:[UIFont fontWithName:@"Helvetica" size:14]];
[lblContent setNumberOfLines:1];
[lblContent setOpaque:YES];
[self addSubview:lblContent];
}
- (void)start
{
if (self.viewContainer == NULL) {
[self setupView];
}
[self startAnimation];
}
- (void)stop
{
}
-(void)startAnimation
{
[UIView beginAnimations:@"MarqueeBarAniamation" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:25];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
CGRect viewFrame = self.viewContainer.frame;
viewFrame.origin.x = -320;
[self.viewContainer setFrame:viewFrame];
[UIView commitAnimations];
}
-(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
CGRect viewFrame = self.viewContainer.frame;
viewFrame.origin.x = 320;
[self.viewContainer setFrame:viewFrame];
[self startAnimation];
}