Вопрос

Я создаю свои собственные UITableViewCells с градиентным фоном.У меня есть вся логика и чертеж, но одна вещь, которую я хочу исправить, - это "неровность" по углам моей пользовательской ячейки:

альтернативный текст http://grab.by/27SM

Если вы увеличите изображение по углам, то сможете увидеть, о чем я говорю.Вот код, который я использую для генерации ячейки:

CGContextRef c = UIGraphicsGetCurrentContext();
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef myGradient = nil;
CGFloat components[8] = TABLE_CELL_BACKGROUND;
CGContextSetStrokeColorWithColor(c, [[UAColor colorWithWhite:0.7 alpha:1] CGColor]);
CGContextSetLineWidth(c, 2);
CGContextSetAllowsAntialiasing(c, YES);
CGContextSetShouldAntialias(c, YES);
CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ;
CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ;

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, minx, miny);
CGPathAddArcToPoint(path, NULL, minx, maxy, midx, maxy, kDefaultMargin);
CGPathAddArcToPoint(path, NULL, maxx, maxy, maxx, miny, kDefaultMargin);
CGPathAddLineToPoint(path, NULL, maxx, miny);
CGPathAddLineToPoint(path, NULL, minx, miny);
CGPathCloseSubpath(path);

// Fill and stroke the path
CGContextSaveGState(c);
CGContextAddPath(c, path);
CGContextClip(c);

CGFloat locations[2] = { 0.0, 1.0 };
CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND;
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2);
CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0);

CGContextRestoreGState(c);  
CGContextAddPath(c, path);
CGContextStrokePath(c);

Что я могу сделать, чтобы сгладить края, сохраняя при этом одинаковую толщину краев во всех ячейках?

Это было полезно?

Решение

Ширина вашей линии установлена равной 2 точкам.Что происходит, так это то, что ваш код вычисляет вашу ограничивающую прямую, не понимая ширины линии.В результате для каждого прямого сегмента вашей фигуры видна только половина ширины обводки.На дуге видна полная ширина штриха.

Вот соответствующий фрагмент кода из моего приложения Funversation, позволяющий нарисовать игральные карты со скругленными углами, похожие на те, что есть у вас.

CGRect rect = [self bounds];
rect.size.width -= lineWidth;
rect.size.height -= lineWidth;
rect.origin.x += lineWidth / 2.0;
rect.origin.y += lineWidth / 2.0;

Добавьте это перед вашим расчетом для minx, midx, maxx и т.д.и штрихи для вашей фигуры должны быть равномерными.

Другие советы

Другим способом сделать последовательный инсульт, чтобы переместить AddPath и HandPath, вызывает вышеупомянутые вызовы RectoreGState, то есть ход при обрезании.

Для действительно 2-PT-широкого хода с этим решением просто удвоить ширину линии, которую вы помещаете в графическое состояние (т. Е. Установите его до 4 PT), поскольку половина его будет обрезано.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top