Нарисуйте линию между двумя точками - Как пройти UIView
Я пытаюсь нарисовать простую линию, соединяющую две точки. Я думаю, что получил правильный код для этого в моем методе drawLine. Линии вообще не появляются, и я уверен, что это связано с тем видом, с которым я звоню, и тем, на котором я хочу нарисовать. В следующем коде я создаю свой следующий вид в коде (данные поступают из веб-службы). Вид создается просто отлично, и все кнопки и объекты появляются.
Я пытаюсь динамически добавлять строки в представление, которое я создаю (далее), и не знаю, как это сделать. Из ошибок, которые я получаю (неверный контекст 0x0), кажется, что я делаю что-то не в порядке. Пытаюсь отобразить на виде, которого там нет. как чем я могу это сделать? Любой совет будет принят во внимание.
Я понимаю, что передача в View не может быть правильным ответом. Я нахожусь в центре проб и ошибок здесь.
Чтобы уточнить: я звоню DrawLine здесь:
[nextView.view addSubview: next];
Спасибо,
Шай
-(void) drawView
{
CGRect rec;
CGFloat width = [UIScreen mainScreen].bounds.size.width;
CGFloat height = [UIScreen mainScreen].bounds.size.height;
UIView *next = [[UIView alloc]initWithFrame:CGRectMake(0, 0, height, width)];
next.backgroundColor = [UIColor whiteColor];
next.userInteractionEnabled = YES;
next.multipleTouchEnabled = YES;
nextView = [UIViewController alloc];
[nextView setTitle: as_objectDesc];
for (object in viewObjects)
{ // ratio based on Ipad 2 screen size conversion from the Datawindow size - alter to support other device
CGFloat objWidth = object.Width/3.83;
CGFloat objHeight = object.Height/2.78;
CGFloat objXPoint = object.positionX/3.83;
CGFloat objYPoint = object.positionY/2.78;
if ([object.Shape isEqualToString:@"text"])
{
rec = CGRectMake(objXPoint, objYPoint, objWidth, objHeight);
UILabel *myLabel = [[UILabel alloc] initWithFrame:rec];
myLabel.backgroundColor = [UIColor clearColor];
myLabel.text = object.objectTag;
myLabel.lineBreakMode = NSLineBreakByWordWrapping;
if ([object.description isEqualToString:@"Header"])
{
myLabel.font = [UIFont systemFontOfSize:20];
}
else
{
myLabel.font = [UIFont systemFontOfSize:10];
}
[next addSubview:myLabel];
}
else if ([object.Shape isEqualToString:@"line"])
{
**[self drawLine:nextView.view];**
}
else
{
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
if ([object.Shape isEqualToString:@"ellipse"])
{
UIImage * buttonImage;
if ([object.Color isEqualToString:@"255"])
{
buttonImage = [UIImage imageNamed:@"redBackground.png"];
}
else if ([object.Color isEqualToString:@"65535"])
{
buttonImage = [UIImage imageNamed:@"yellowBackground.png"];
}
else if ([object.Color isEqualToString:@"GRAY"])
{
buttonImage = [UIImage imageNamed:@"graybground.PNG"];
}
else if ([object.Color isEqualToString:@"BLACK"])
{
buttonImage = [UIImage imageNamed:@"BlackBackground.png"];
}
[myButton setBackgroundImage:buttonImage forState: UIControlStateNormal];
objWidth = objHeight;
rec = CGRectMake(objXPoint, objYPoint, objWidth, objHeight);
myButton.frame = rec;
myButton.clipsToBounds = YES;
myButton.layer.cornerRadius = objWidth/2;
}
else
{
rec = CGRectMake(objXPoint, objYPoint, objWidth, objHeight);
if ([object.Color isEqualToString:@"255"])
myButton.backgroundColor = [UIColor redColor];
else if ([object.Color isEqualToString:@"65535"])
myButton.backgroundColor = [UIColor yellowColor];
else if ([object.Color isEqualToString:@"GRAY"])
myButton.backgroundColor = [UIColor grayColor];
else if ([object.Color isEqualToString:@"BLACK"])
myButton.backgroundColor = [UIColor blackColor];
}
[[myButton layer] setBorderWidth:1.0f];
[[myButton layer] setBorderColor:[UIColor blackColor].CGColor];
myButton.enabled = YES;
myButton.accessibilityHint = object.objectTag;
myButton.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
myButton.titleLabel.textAlignment = NSTextAlignmentCenter;
myButton.titleLabel.font = [UIFont systemFontOfSize:13];
[myButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[myButton addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
myButton.frame = rec;
[myButton setTitle:object.description forState:UIControlStateNormal];
// Check if an Empty Rectangle
NSRange test =[myButton.accessibilityHint rangeOfString:@"r_"];
if (test.location == 0)
{
[next sendSubviewToBack:myButton];
[myButton setEnabled:NO];
}
[next addSubview:myButton];
}
UIPinchGestureRecognizer *twoFingerPinch = [[UIPinchGestureRecognizer alloc]
initWithTarget:self
action:@selector(twoFingerPinch:)]
;
[[nextView view] addGestureRecognizer:twoFingerPinch];
[next addSubview:activityIndicator];
[next bringSubviewToFront:activityIndicator];
}
[nextView.view addSubview:next];
[self dismissViewControllerAnimated:NO completion:nil];
[self.navigationController pushViewController:nextView animated:NO];
}
- (void)drawLine:(UIView *) view
{
CGFloat x1 = object.positionX;
CGFloat y1 = object.positionY;
CGFloat x2 = object.positionX2;
CGFloat y2 = object.positionY2;
CGContextRef context = UIGraphicsGetCurrentContext();
if ([object.Color isEqualToString:@"255"])
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
else if ([object.Color isEqualToString:@"65535"])
CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);
else if ([object.Color isEqualToString:@"GRAY"])
CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor);
else if ([object.Color isEqualToString:@"BLACK"])
CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
CGContextSetLineWidth(context, 3.0);
CGContextBeginPath(context);
CGContextMoveToPoint(context, x1, y1);
CGContextAddLineToPoint(context, x2, y2);
CGContextStrokePath(context);
}
1 ответ
Я заканчиваю тем, что выяснил это до конца и подумал, что поделюсь здесь. Я мог бы добавить в свой вопрос много кода, который не помог бы упростить его для других (без комментариев).
Суть этого в том, что при попытке нарисовать линию необходимо переопределить метод DrawRect подкласса UIView, а не UIViewController, как я это сделал. Нет ошибки, если вы вызываете DrawRect из вашего UIViewController, но он ничего не делает. Я пропустил эту маленькую деталь.
Что еще сложнее было выяснить и решить эту проблему, так это то, что я создавал все это программно и изначально вообще не подкласс UIView. В итоге я добавил все точки в NSMutablearray и перерисовал строки в следующем классе после создания нового представления:
#import "draw.h"
@implementation draw
@synthesize lines;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Initialization code
}
return self;
}
-(void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
for (line *myLine in lines)
{
if ([myLine.color isEqualToString:@"255"])
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
else if ([myLine.color isEqualToString:@"65535"])
CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);
else if ([myLine.color isEqualToString:@"GRAY"])
CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor);
else if ([myLine.color isEqualToString:@"BLACK"])
CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
int setNew = myLine.Width/4;
CGContextSetLineWidth(context, (CGFloat)setNew);
CGContextBeginPath(context);
CGContextMoveToPoint(context, myLine.x1, myLine.y1);
CGContextAddLineToPoint(context, myLine.x2, myLine.y2);
CGContextStrokePath(context);
}
}
@end