2015-07-08 3 views
1

У меня есть приложение для iPhone, где я предоставляю эскизную панель для пользователя, чтобы сохранить подпись. UIImageView добавляется к основному виду и удерживает штрихи. По какой-то причине вы можете рисовать только короткие строки на пэде, как показано на следующем рисунке.Objective C - Sketch Application не будет рисовать длинные строки

enter image description here

У меня есть другое приложение для IPad, который использует тот же код и он работает отлично. Я не уверен, что может вызвать это. Я не использую никакого кода касания или жеста, который бы мешал ему. Ниже приведен код, который я использую.

UPDATE: Если я создаю UIViewController с тем же классом и сделаю его контроллером корневого представления, тогда он отлично работает. Что-то в моей навигационной иерархии делает что-то странное. enter image description here

-(void)SetUpSignaturePad{ 
//create a frame for our signature capture 
imageFrame = CGRectMake(self.view.frame.origin.x, 
         self.view.frame.origin.y, 
         self.view.frame.size.width + 23, 
         self.view.frame.size.height + 7); 
//allocate an image view and add to the main view 
    mySignatureImage = [[UIImageView alloc] initWithImage:nil]; 
    mySignatureImage.frame = imageFrame; 
    mySignatureImage.backgroundColor = [UIColor whiteColor]; 
    [self.view addSubview:mySignatureImage]; 
} 

//when one or more fingers touch down in a view or window 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

//did our finger moved yet? 
fingerMoved = NO; 
UITouch *touch = [touches anyObject]; 

//we need 3 points of contact to make our signature smooth using quadratic bezier curve 
currentPoint = [touch locationInView:mySignatureImage]; 
lastContactPoint1 = [touch previousLocationInView:mySignatureImage]; 
lastContactPoint2 = [touch previousLocationInView:mySignatureImage]; 


//when one or more fingers associated with an event move within a view or window 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

//well its obvious that our finger moved on the screen 
fingerMoved = YES; 
UITouch *touch = [touches anyObject]; 

//save previous contact locations 
lastContactPoint2 = lastContactPoint1; 
lastContactPoint1 = [touch previousLocationInView:mySignatureImage]; 
//save current location 
currentPoint = [touch locationInView:mySignatureImage]; 

//find mid points to be used for quadratic bezier curve 
CGPoint midPoint1 = [self midPoint:lastContactPoint1 withPoint:lastContactPoint2]; 
CGPoint midPoint2 = [self midPoint:currentPoint withPoint:lastContactPoint1]; 

//create a bitmap-based graphics context and makes it the current context 
UIGraphicsBeginImageContext(imageFrame.size); 

//draw the entire image in the specified rectangle frame 
[mySignatureImage.image drawInRect:CGRectMake(0, 0, imageFrame.size.width, imageFrame.size.height)]; 

//set line cap, width, stroke color and begin path 
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 3.0f); 
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); 
CGContextBeginPath(UIGraphicsGetCurrentContext()); 

//begin a new new subpath at this point 
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), midPoint1.x, midPoint1.y); 
//create quadratic Bézier curve from the current point using a control point and an end point 
CGContextAddQuadCurveToPoint(UIGraphicsGetCurrentContext(), 
          lastContactPoint1.x, lastContactPoint1.y, midPoint2.x, midPoint2.y); 

//set the miter limit for the joins of connected lines in a graphics context 
CGContextSetMiterLimit(UIGraphicsGetCurrentContext(), 2.0); 

//paint a line along the current path 
CGContextStrokePath(UIGraphicsGetCurrentContext()); 

//set the image based on the contents of the current bitmap-based graphics context 
mySignatureImage.image = UIGraphicsGetImageFromCurrentImageContext(); 

//remove the current bitmap-based graphics context from the top of the stack 
UIGraphicsEndImageContext(); 

} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
//if the finger never moved draw a point 
if(!fingerMoved) { 
    UIGraphicsBeginImageContext(imageFrame.size); 
    [mySignatureImage.image drawInRect:CGRectMake(0, 0, imageFrame.size.width, imageFrame.size.height)]; 

    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 3.0f); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    CGContextFlush(UIGraphicsGetCurrentContext()); 

    mySignatureImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    } 
} 

//calculate midpoint between two points 
- (CGPoint) midPoint:(CGPoint)p0 withPoint: (CGPoint) p1 { 
    return (CGPoint) { 
     (p0.x + p1.x)/2.0, 
     (p0.y + p1.y)/2.0 
    }; 
} 

ответ

1

Я сожалею, чтобы сказать вам, что я не реальное решение, но ваша проблема, скорее всего, из-за проблем с производительностью. Зачем? Потому что вы создаете изображение каждый раз, когда обнаружен жест. Для создания изображений требуется визуализация экрана, требующая времени и ресурсов.
Вы должны основывать свой код на том же проекте, который имеет функции рисования, обычно используя представление, которое обновляет их ничью в методе drawRect, так как вы, возможно, CAShapeLaywr тоже прекрасны.
Время работы Профилирование в приборах и поиск по методу танка.

+0

Я не думаю, что это проблема с производительностью. При попытке привлечь практически невозможно увеличить использование ресурсов. –

Смежные вопросы