- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在圆圈内点击时找到该区域。其实我已经做了一个计算,但那是不准确的。
检查我编写的代码片段,以便在我的循环 View 中找到选项卡的位置。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event" this method
float dx = touchLocation.x -160;
float dy = touchLocation.y - 240;
double angle = atan2(touchLocation.x,touchLocation.y);
/* Device is iPad */
if (count==4) {
if(angle>-1.639&&angle<=0.775)
{
area=1;
NSLog(@"touched here 1 ********************************** ");
}
else if(angle>0.775&&angle<=1.579)
{
area=2;
NSLog(@"touched here 2********************************** ");
}
else if(angle>1.579&&angle<=2.466)
{
area=3;NSLog(@"touched here 3********************************** ");
}
else
{
area=4;NSLog(@"touched here 4 ********************************** ");
}
}
else if (count==5) {
if(angle>-1.520&&angle<=0.553)
{
area=1;
NSLog(@"touched here 1 ********************************** ");
}
else if(angle>0.553&&angle<=1.262)
{
area=2;
NSLog(@"touched here 2********************************** ");
}
else if(angle>1.262&&angle<=1.884)
{
area=3;NSLog(@"touched here 3********************************** ");
}
else if(angle>1.884&&angle<=2.644)
{
area=4;NSLog(@"touched here 4 ********************************** ");
}
else
{
area=5;NSLog(@"touched here 5 ********************************** ");
}
}
else if (count==6) {
if(angle>-1.5707&&angle<=0.4692)
{
area=1;
NSLog(@"touched here 1 ********************************** ");
}
else if(angle>0.4692&&angle<=1.0219)
{
area=2;
NSLog(@"touched here 2********************************** ");
}
else if(angle>1.0219&&angle<=1.5707)
{
area=3;NSLog(@"touched here 3********************************** ");
}
else if(angle>1.5707&&angle<=2.1147)
{
area=4;NSLog(@"touched here 4 ********************************** ");
}
else if(angle>2.1147&&angle<=2.7245)
{
area=5;NSLog(@"touched here 5 ********************************** ");
}
else
{
area=6;NSLog(@"touched here 6 ********************************** ");
}
}
else if (count==7) {
if(angle>-1.5707&&angle<=0.3992)
{
area=1;
NSLog(@"touched here 1 ********************************** ");
}
else if(angle>0.3992&&angle<=0.8602)
{
area=2;
NSLog(@"touched here 2********************************** ");
}
else if(angle>0.8602&&angle<=1.346)
{
area=3;NSLog(@"touched here 3********************************** ");
}
else if(angle>1.346&&angle<=1.812)
{
area=4;NSLog(@"touched here 4 ********************************** ");
}
else if(angle>1.812&&angle<=2.304)
{
area=5;NSLog(@"touched here 5 ********************************** ");
}
else if(angle>2.304&&angle<=2.828)
{
area=6;NSLog(@"touched here 6 ********************************** ");
}
else
{
area=7;NSLog(@"touched here 7 ********************************** ");
}
}
else if (count==8){
if(angle>-1.40&&angle<=0.45)
{
area=1;
NSLog(@"touched here 1 ********************************** ");
}
else if(angle>.45&&angle<=.73)
{
area=2;
NSLog(@"touched here 2********************************** ");
}
else if(angle>.73&&angle<=1.15)
{
area=3;NSLog(@"touched here 3********************************** ");
}
else if(angle>1.15&&angle<=1.55){
area=4;NSLog(@"touched here 4 ********************************** ");
}
else if(angle>-1.55&&angle<=1.95){
area=5;NSLog(@"touched here 5 ********************************** ");
}
else if(angle>-1.95&&angle<=2.43){
area=6;NSLog(@"touched here 6 ********************************** ");
}
else if(angle>2.43&&angle<=2.98){
area=7;NSLog(@"touched here 7********************************** ");
}
// else if(angle>2.98&&angle<=-1.40){
else
{
area=8;NSLog(@"touched here 8 ********************************** ");
}
}
最佳答案
更新:添加了完整的工作代码
这里有一些伪代码可以帮助你找出你点击的位置。这是引用最上面的图。 (我假设你的圆心与 View 的中心重合):
(1) 求圆心到接触点的线段方向:
dx = touchPoint.x - circleCenter.x;
dy = touchPoint.y - circleCenter.y;
t = atan2(dy, dx); // some offsetting/direction adjustment might be required
octant = floor(4 * t/M_PI); // will return a number between 0 and 7.
dist = sqrtf(dx * dx + dy * dy);
if ( dist < innerRadius[i]) ... // again, you might need to adjust the angle calculations to ensure that the right indices correspond to the right sector. See (working) code below...
innerRadius[8]
是一个包含每个八分圆内半径的数组。
ViewController.m
的内容即可在“单一 View 应用程序”模板中:
#import "ViewController.h"
static float innerRadii[] = {50, 75, 100, 125, 150, 175, 200, 225};
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
float side = 600; // square view
CGPoint center = CGPointMake(side/2, side/2);
CGFloat radius = side/2 * 0.9;
UIGraphicsBeginImageContextWithOptions(CGSizeMake(side, side), YES, 0.0);
UIBezierPath *bgPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, side, side)];
[[UIColor lightGrayColor] setFill];
[bgPath fill];
for (int i = 0; i < 8; i++)
{
UIBezierPath *sector = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:M_PI/4 * i endAngle:M_PI/4 * (i+1) clockwise:YES];
[sector addLineToPoint:center];
[sector closePath];
#define VAL(x) x/2 + 0.25
[[UIColor colorWithRed:VAL((float)(i % 2)) green:VAL((float)((i >> 1) % 2)) blue:VAL((float)((i >> 2) % 2)) alpha:1.0] setFill];
[sector fill];
UIBezierPath *innerSector = [UIBezierPath bezierPathWithArcCenter:center radius:innerRadii[i] startAngle:M_PI/4 * i endAngle:M_PI/4 * (i+1) clockwise:YES];
[innerSector addLineToPoint:center];
[innerSector closePath];
#define VAL1(x) (1- x)/3 + 0.5
[[UIColor colorWithRed:VAL1((float)(i % 2)) green:VAL1((float)((i >> 1) % 2)) blue:VAL1((float)((i >> 2) % 2)) alpha:1.0] setFill];
[innerSector fill];
}
UIImage *pieChartImg = UIGraphicsGetImageFromCurrentImageContext();
UIImageView *pieChartView = [[UIImageView alloc] initWithImage:pieChartImg];
pieChartView.center = self.view.center;
[self.view addSubview:pieChartView];
UITapGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(identifyTappedSector:)];
pieChartView.userInteractionEnabled = YES;
[pieChartView addGestureRecognizer:gr];
}
- (void)identifyTappedSector:(UITapGestureRecognizer *)tgr
{
CGPoint touchPoint = [tgr locationInView:tgr.view];
CGPoint circleCenter = CGPointMake(tgr.view.bounds.size.width/2, tgr.view.bounds.size.height/2);
float dx = circleCenter.x - touchPoint.x;
float dy = circleCenter.y - touchPoint.y;
float t = atan2f(dy, dx) + M_PI;
NSLog(@"angle = %f", t * 180.0/M_PI);
int octant = floorf(4 * t/M_PI);
NSLog(@"You tapped octant number: %d!", octant);
float dist = sqrtf(dx * dx + dy * dy);
if (dist <= innerRadii[octant])
NSLog(@"\tYou tapped the inner sector!");
else
NSLog(@"\tYou tapped the annulus!");
}
@end
关于ios - 如何在ios中点击内圈时检测区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23509604/
我需要你的帮助!我在它们之间放置了随机数量的 div。 Item description Item description Item description Item
我有两个 NSDates,时间格式为“h:mm a”(即 6:00 AM 和 8:00 PM)。 我试图找出这两个时间之间的中点是什么时间。 对于上面的示例,早上 6:00 和晚上 8:00 之间的中
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我正在寻找一种有效的算法来检查一个点是否在 3D 中的另一个点附近。 sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2) < radius 这似乎并不太快,实际上我不需要这
我可以让 pandas cut/qcut 函数返回 bin 端点或 bin 中点而不是一串 bin 标签吗? 目前 pd.cut(pd.Series(np.arange(11)), bins = 5)
我是一名优秀的程序员,十分优秀!