#xcode #ipad #line #alpha
#xcode #iPad #линия #альфа
Вопрос:
Я новичок в xCode, и у меня с этим проблема. Я создаю приложение для своего Ipad. Я хочу выделить текст, но я не могу установить непрозрачность моей строки. Я искал в Интернете, но не нашел никакой информации об этом.Теперь я использую это drawImage.alpha = lineOpacity; но это нехорошо, все, что я рисовал раньше, приобретает такую непрозрачность.Я просто хочу, чтобы альфа-версия была выполнена при новом рисовании. я использую этот код сейчас:
//here I init the opacity
-(id)init
{
if (self = [super init])
{
strokeWidth = 5;
strokeColor = CGColorRetain([[TiUtils colorValue:@"#000"] _color].CGColor);
lineOpacity = 1;
}
return self;
}
- (void)dealloc
{
RELEASE_TO_NIL(drawImage);
CGColorRelease(strokeColor);
[super dealloc];
}
- (void)frameSizeChanged:(CGRect)frame bounds:(CGRect)bounds
{
[super frameSizeChanged:frame bounds:bounds];
if (drawImage!=nil)
{
[drawImage setFrame:bounds];
}
}
//here I add a call
- (void)setLineOpacity_:(id)alpha
{
lineOpacity = [TiUtils floatValue:alpha];
}
//here I want to set the opacity
- (void)drawAt:(CGPoint)currentPoint
{
UIView *view = [self imageView];
UIGraphicsBeginImageContext(view.frame.size);
[drawImage.image drawInRect:CGRectMake(0, 0, view.frame.size.width, view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), strokeWidth);
CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), strokeColor);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
//here i want to set the alpha, but everything I draw before get also the new alpha.
//I just want the alpha to be done on the new draw
drawImage.alpha = lineOpacity;
drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
lastPoint = currentPoint;
}
Я надеюсь, что кто-нибудь сможет мне помочь. Заранее спасибо.
Редактировать: я использую это для рисования:
- (UIImageView*)imageView
{
if (drawImage==nil)
{
drawImage = [[UIImageView alloc] initWithImage:nil];
drawImage.frame = [self bounds];
[self addSubview:drawImage];
}
return drawImage;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
lastPoint = [touch locationInView:[self imageView]];
lastPoint.y -= 20;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:[self imageView]];
currentPoint.y -= 20;
[self drawAt:currentPoint];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
[self drawAt:lastPoint];
}
#pragma mark Public APIs
- (void)setStrokeWidth_:(id)width
{
strokeWidth = [TiUtils floatValue:width];
}
- (void)setStrokeColor_:(id)value
{
CGColorRelease(strokeColor);
TiColor *color = [TiUtils colorValue:value];
strokeColor = [color _color].CGColor;
CGColorRetain(strokeColor);
}
- (void)setLineOpacity_:(id)alpha
{
lineOpacity = [TiUtils floatValue:alpha];
}
Я действительно хочу выяснить, как это не сработает, долго искал по этому поводу.
Ответ №1:
Вы можете создать UIColor и получить CGColorRef из него следующим образом:
strokeColor = CGColorRetain([UIColor colorWithRed:1.0f green:1.0f blue:0.0f alpha:0.5f].CGColor);
Комментарии:
1. Когда я включаю ваш код, мое приложение завершает работу. Вы не знаете другого способа? Как я уже писал выше, я могу использовать strokeColor.setOpacity(0.2)). Но когда я использую его таким образом, я получаю это в результате: i55.tinypic.com/zufbbq.png
2. Извините, я не присмотрелся к вашему коду. Очевидно, что с помощью моего метода вам все еще нужно сохранить объект CGColor.
3. Вы знаете, как я могу это исправить, i55.tinypic.com/zufbbq.png . Я перепробовал все, но не могу это исправить (шарики в строке). Большое спасибо
4. Я представляю, что вы рисуете «шар» каждый раз, когда вы вызываете
drawAt:
, и они накладываются друг на друга. Лучшим подходом было бы создать подкласс UIView и нарисовать путь выделения в егоdrawRect:
методе. Обновите список точек в различныхtouches*
методах, а затем используйте этот список для рисования пути.5. Я понимаю, что вы имеете в виду, но я не знаю, как я могу это исправить.
Ответ №2:
Непрозрачность устанавливается с помощью альфа-значения цвета обводки (0,5 в этом примере):
strokeColor = CGColorCreateGenericRGB(1.0f, 1.0f, 0.0f, 0.5f);
Комментарии:
1. Я пробовал, но он говорит, что я не могу его использовать. ошибка: ‘CGColorCreateGenericRGB’ недоступен (объявлен на /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/CoreGraphics.framework/Headers/CGColor.h:29). Я также пытался установить непрозрачность штриха ранее (не по-вашему, просто strokColor.setOpacity(0.2)), я получил это в результате: i55.tinypic.com/zufbbq.png .
2. Ваш результат показывает, что непрозрачность работает. Что вам, вероятно, не нравится, так это неоднородный результат. Скорее всего, это вызвано рисованием нескольких отдельных сегментов линии вместо одного непрерывного пути. При использовании отдельных сегментов цвет перекрывающихся сегментов суммируется и приводит к образованию темных пятен. Чтобы избежать этого, добавьте все точки к контуру и нарисуйте контур.
3. У меня это сработало: CGContextSetRGBStrokeColor (UIGraphicsGetCurrentContext(), 1.0f, 1.0f, 0.0f, 0.2f); Но у меня возникла та же проблема, что и на рисунке выше. Я добавил код, который использую для рисования в режиме просмотра. Можете ли вы объяснить мне, как я могу решить эту проблему? Заранее спасибо!