Xuni コントロール > FlexChart > 機能 > ヒットテスト |
HitTest()
メソッドを使用して、FlexChart 内でユーザーがタップしたポイントの X および Y 座標やインデックスを判定します。このメソッドは、FlexChart の系列外にツールチップを表示するといったシナリオで役立ちます。
次のコード例は、chart_Tapped
イベントを定義する方法を示します。このイベントは、HitTest()
メソッドを呼び出して、FlexChart 領域内のタップされたポイントの情報を取得し、それをグラフのフッターに表示します。
次の図は、HitTest
() メソッドを定義した後の FlexChart を示しています。
クイックスタートで説明したものと同じ手順で、HitTestData という Cocoa クラスを追加します。Project Navigator から、HitTestData.swiftまたはHitTestData.h(および HitTestData.m)を開きます。ファイル内のコードを次のコードで置き換えます。
import Foundation
import UIKit
class HitTestData: NSObject
{
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
class func cosData() -> NSMutableArray
{
var cosData = NSMutableArray()
for var i = 0; i < 40; i++
{
let cosPoint = HitTestData(x: Double(i), y: cos(Double(i) * 0.12))
cosData.addObject(cosPoint)
}
return cosData
}
class func sinData() -> NSMutableArray
{
var sinData = NSMutableArray()
for var i = 0; i < 40; i++
{
let sinPoint = HitTestData(x: Double(i), y: sin(Double(i) * 0.12))
sinData.addObject(sinPoint)
}
return sinData
}
}
#import <Foundation/Foundation.h>
@interface HitTestData : NSObject
@property NSNumber *x;
@property NSNumber *y;
-(id)initWithX: (NSNumber *)x Y: (NSNumber *)y;
+(NSMutableArray *)cosData;
+(NSMutableArray *)sinData;
@end
#import "HitTestData.h"
#import "math.h"
@implementation HitTestData
-(id)initWithX:(NSNumber *)x Y:(NSNumber *)y{
self = [super init];
if(self){
_x = x;
_y = y;
}
return self;
}
//ランダムのデータを生成します。
+(NSMutableArray *) cosData{
NSMutableArray *cosData = [[NSMutableArray alloc] init];
for (int i = 0; i <40; i++) {
HitTestData *cosPoint = [[HitTestData alloc]initWithX:@(i) Y:@(cos(i * 0.12))];
[cosData addObject:cosPoint];
}
return cosData;
}
//ランダムのデータを生成します。
+(NSMutableArray *) sinData{
NSMutableArray *sinData = [[NSMutableArray alloc] init];
for (int i = 0; i <40; i++) {
HitTestData *sinPoint = [[HitTestData alloc]initWithX:@(i) Y:@(sin(i *0.12))];
[sinData addObject:sinPoint];
}
return sinData;
}
@end
FlexChart コントロールを初期化するには、Project Navigator から ViewController.m
またはViewController.swift
ファイルを開き、その内容を次のコードで置き換えます。これは、FlexChart を初期化するために、View コントローラの viewDidLoad メソッドをオーバーライドします。
import UIKit
import XuniFlexChartKit
class ViewController: UIViewController, FlexChartDelegate
{
var chart = FlexChart()
override func viewDidLoad() {
super.viewDidLoad()
self.title = NSLocalizedString("Hit Test", comment: "")
// ビューを読み込んだ後の追加セットアップを行います。
let seriesCosX = XuniSeries(forChart: _chart, binding: "y, y", name: "cos(x)")
let seriesSinX = XuniSeries(forChart: _chart, binding: "y, y", name: "sin(x)")
seriesCosX.itemsSource = HitTestData.cosData()
seriesSinX.itemsSource = HitTestData.sinData()
chart.series.addObject(seriesCosX)
chart.series.addObject(seriesSinX)
chart.bindingX = "x"
chart.delegate = self
chart.chartType = XuniChartType.LineSymbols
chart.axisY.format = "F"
chart.header = "Trigonometric Functions"
chart.footer = "Cartesian coordinates"
self.view.addSubview(_chart)
}
override func viewDidLayoutSubviews()
{
super.viewDidLayoutSubviews()
chart.frame = CGRectMake(0, self.view.bounds.size.height / 8, self.view.bounds.size.width, self.view.bounds.size.height * 5 / 8)
}
func tapped(sender: XuniView!, point: XuniPoint!) -> Bool
{
let hitTest = chart.hitTest(point)
return false;
}
}
#import <UIKit/UIKit.h>
#import <FlexChartKit/FlexChartKit.h>
@interface ViewController : UIViewController <FlexChartDelegate>
@end
#import "ViewController.h"
#import "HitTestData.h"
#import "FlexChartKit/FlexChartKit.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// ビューを読み込んだ後の追加セットアップを行います。
//系列、ポイントインデックス、および x 値と y 値のラベルを追加。
UILabel *seriesLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 270, 200, 200)];
seriesLabel.text = @" Series";
seriesLabel.tag = 2;
UILabel *pointIndexlabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 290, 200, 200)];
pointIndexlabel.text = @" Point Index";
pointIndexlabel.tag = 3;
UILabel *xyLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 310, 200, 200)];
xyLabel.text = @" X Y Values";
xyLabel.tag = 4;
FlexChart *chart = [[FlexChart alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height/50, self.view.bounds.size.width*2/3, self.view.bounds.size.height*5/15)];
chart.bindingX = @"x";
XuniSeries *seriesCosX = [[XuniSeries alloc] initForChart:chart binding:@"y, y" name:@"cos(x)"];
XuniSeries *seriesSinX = [[XuniSeries alloc] initForChart:chart binding:@"y, y" name:@"sin(x)"];
seriesCosX.itemsSource = [HitTestData cosData];
seriesSinX.itemsSource = [HitTestData sinData];
//系列オブジェクトの追加。
[chart.series addObject:seriesCosX];
[chart.series addObject:seriesSinX];
chart.delegate = self;
chart.tag = 1;
chart.axisX.labelsVisible = true;
chart.chartType = XuniChartTypeLineSymbols;
chart.axisY.format = @"d";
//ヘッダーとフッターの設定。
chart.header = @"Trigonometric Functions";
chart.footer = @"Cartesian coordinates";
[self.view addSubview:chart];
[self.view addSubview:seriesLabel];
[self.view addSubview:pointIndexlabel];
[self.view addSubview:xyLabel];
}
- (void)selectionChanged:(XuniHitTestInfo*)hitTestInfo {
}
- (void)seriesVisibilityChanged:(XuniSeries*)series{
}
- (void)rendered{
}
- (BOOL)tapped:(XuniPoint*)point{
FlexChart *chart = (FlexChart*)[self.view viewWithTag:1];
UILabel *s = (UILabel *)[self.view viewWithTag:2];
UILabel *pi = (UILabel *)[self.view viewWithTag:3];
UILabel *xy = (UILabel *)[self.view viewWithTag:4];
XuniHitTestInfo *hitTest = [chart hitTest:point];
s.text = [@" Series: " stringByAppendingString: hitTest.series.name];
pi.text = [@" Point Index: " stringByAppendingString: [NSString stringWithFormat:@"%i", hitTest.pointIndex]];
xy.text = [[NSString stringWithFormat:@" X:%1.2f", point.x] stringByAppendingString: [NSString stringWithFormat:@" Y:%1.2f", point.y]];
return true;
}
@end