私は株式市場に関連する iPhone アプリに取り組んでいます。
株式ティッカーに似た水平スクローラーを作成する必要があります。
それを達成するために私は何をすべきですか?
私は株式市場に関連する iPhone アプリに取り組んでいます。
株式ティッカーに似た水平スクローラーを作成する必要があります。
それを達成するために私は何をすべきですか?
この種のことはひどい迷惑であり、(私が知る限り)簡単な既存の方法はありません。
まず、各ブロックを同じ長さにして、KISSを単純化する必要があります。これがその方法です。
(1)「ブロック」ごとに標準の幅(たとえば、100ピクセル)を作成します。
ブロックは単にUIView(または単にテキストラベル)になります。その場でUIViewを作成することに慣れていますか?そうでない場合は、その方法を説明します。
(2)画面のすぐ右側にある旅の開始点を選択します
(3)画面のすぐ左側にある旅の終点を選択します
(3b)ポイント1からポイント2までの移動時間に必要な正確な時間(「4.71937s」など)を選択します
(4)ブロックが右から左にそれ自体の長さを移動するのにかかる秒数を正確に(正確に正確に!)把握します。0.91763秒としましょう
これを行うには、NSTimersを使用する必要があります。これをご存知ですか?
(5)定期的な0.91763sタイマーを設定します。これにより、新しいブロックが作成され、
(5b)次のテキスト情報(「AAPL408.50」など)があればそれが吸い取られ、
(5c)開始点に配置されます2。
(5d)コアアニメーションを使用するだけで、エンドポイント3に向かってアニメーションが開始され、
(5e)このブロックに対して個別のワンショットタイマーが起動されます。これにより、3bで説明した全体の時間が経過するとこのブロックが破棄されます。
それでおしまい。
テキストアイテム(選択したものは何でも)用に単純なFIFOスタックを設定する必要があります。これは、任意のソースからテキストアイテムを取得し、そこに押し込むためです。
情報のスタックとして使用するために、ある種の配列を設定しても問題ありませんか?そうでなければ、私たちは助けることができます!:)
(5b)では、使用したものをスタックのもう一方の端に押し戻す可能性が高いため、すべてが永遠に続くことに注意してください。個々のアイテムをタッチして削除したり、たとえば価格を変更したり、新しい情報が入ってくると何でも変更できるようにする必要がある可能性が非常に高くなります。
これが機能するようになったら(「標準ブロック長方式」)。どういうわけか、各テキストブロックの正確な長さを計算することをお勧めします(AAPL400.50はAAPL30よりも長いです)...そうするために...
そのブロックだけの各ブロックの新しい自分の長さの時間値(ポイント4のように)をその場で計算します。つまり、ポイント5.b.2でそれを行います。定期的なタイマー(ポイント5)を使用する代わりに、新しいタイマー(5f)を起動して、次のブロックを起動します。(明確にするために、ポイント3bと5eは変更されていません。)
それが役に立てば幸い!
私が質問を正しく理解していれば、1 つの簡単な解決策は、NSTimer を使用して UILabel を更新することです (以下のすぐにノックアップされたコードを参照してください)。アプリケーションによってはこれで十分かもしれませんが、新しいデータで文字列を更新し続ける必要がある場合は、さらに作業を行う必要があります。
この単純な解決策では、特にスムーズなスクロールは得られません。むしろ、一度に 1 文字幅ずつジャンプし、デフォルトのシステム フォントでは、すべての文字が他のすべての文字と同じ幅であるとは限りません。
よりスムーズなスクロールを行うには、文字列をグラフィックス コンテキストにレンダリングし (NSString で drawInRect:withFont: を使用)、UIImage を作成し、一度に n ピクセルずつ微調整します。画像の右端に近づいたら、最初のコピーの終わりの右側にもう一度画像をレンダリングする必要があります。
大まかなアプローチを示す単純なコード (.h ファイルと .m ファイルを組み合わせたもの) を次に示します。
// stock ticker example code
//
// Created by Matthew Elton on 27/12/2010.
// http://www.obliquely.org.uk/blog/app All rights reserved.
//
#define TICKER_WIDTH 250.0
#define TICKER_FONT_SIZE 18.0
#define TICKER_RATE 0.2 // nudge along five times a second
#import <UIKit/UIKit.h>
@interface tickerAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
NSString* tickerString;
UILabel *tickerLabel;
}
@property (nonatomic, retain) NSString* tickerString;
@property (nonatomic, retain) UILabel* tickerLabel;
@property (nonatomic, retain) IBOutlet UIWindow *window;
- (void) nudgeTicker: theTimer;
@end
@implementation tickerAppDelegate
@synthesize window, tickerString, tickerLabel;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[self setTickerString: @"This is the sample string to use on the ticker. It is quite long. So I need to fill it out with random content. "];
CGSize labelContentSize = [[self tickerString] sizeWithFont: [UIFont systemFontOfSize:TICKER_FONT_SIZE] forWidth: 2000.0 lineBreakMode: UILineBreakModeClip];
[self setTickerLabel: [ [ [UILabel alloc] initWithFrame:CGRectMake(20,40,TICKER_WIDTH, labelContentSize.height)] autorelease]];
[[self tickerLabel] setFont: [UIFont systemFontOfSize:TICKER_FONT_SIZE]];
[[self tickerLabel] setText: [self tickerString]];
[[self tickerLabel] setBackgroundColor:[UIColor lightGrayColor]];
[[self tickerLabel] setLineBreakMode:UILineBreakModeClip];
[NSTimer scheduledTimerWithTimeInterval:TICKER_RATE target:self selector: @selector(nudgeTicker:) userInfo:nil repeats:YES];
[window addSubview:[self tickerLabel]];
[self.window makeKeyAndVisible];
return YES;
}
- (void) nudgeTicker: theTimer;
{
NSString* firstLetter = [[self tickerString] substringWithRange: NSMakeRange(0,1)];
NSString* remainder = [[self tickerString] substringWithRange:NSMakeRange(1,[[self tickerString] length]-1)];
[self setTickerString: [remainder stringByAppendingString: firstLetter]];
[[self tickerLabel] setText:[self tickerString]];
}
- (void)dealloc {
[window release];
[tickerString release];
[tickerLabel release];
[super dealloc];
}
@end