2010-10-11 3 views
0

Я хочу разместить некоторые «ручки» на UIView У меня есть экран.drawRect: не работает

Итак, я создаю более UIView с, по одному на каждом углу кадра прямоугольника UIView «s, и я просто хочу, чтобы нарисовать круг, который„заполняет“прямоугольник, который является кадр„осилить“UIView ,

Вот что я имею в виду:

Как создать "HandleView":

CGPoint upperLeft = CGPointMake([[self viewToMove] frame].origin.x - 5, [[self viewToMove] frame].origin.y - 5); 
HandleView *uL = [[HandleView alloc] initWithFrame:CGRectMake(upperLeft.x, upperLeft.y, 10, 10)]; 
[self setUpperLeftHandle:uL]; 
[uL release]; 
[[self view] addSubview:[self upperLeftHandle]]; 

DrawRect: для HandleView:

- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [[UIColor orangeColor] set]; 
    CGContextFillEllipseInRect(context, [self frame]); 
} 

Что я получаю просто набор черных прямоугольников, где я помещаю HandleViews. Я не уверен, почему они черные, но я могу изменить цвет, изменив свойство [HandleView backgroundColor]. Я не могу, однако, получить что-либо, чтобы DRAW с этой точки зрения. Вызов setNeedsDisplay, похоже, не имеет значения.

Кроме того, вызывается метод drawRect:, поэтому есть проблема с кодом там, вероятно, нигде.

Прошло некоторое время с тех пор, как я испортил пользовательский рисунок, но я не помню, чтобы это было тяжело.

Что мне не хватает?

Спасибо !!!

Update:

Модифицированный код следующим образом:

- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     // Initialization code 
    [self setBackgroundColor:[UIColor clearColor]]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBFillColor(context, 100, 100, 100, 1.0); 
    CGContextFillEllipseInRect(context, rect); 
} 

Теперь я вижу круг, но только там, где он перекрывает другой вид. Где он сидит на вершине «фона» UIView, я ничего не вижу, что вижу. Кроме того, даже если цвет (100, 100, 100), он показывает белый/светло-серый.

В чем дело?

+0

Ум, я бы попробовал CGContextSetRGBFillColor вместо [[UIColor orangeColor]]. Кроме того, избегайте использования [self frame] внутри этого метода: вы уже передали в качестве параметра rect, используйте это или получите окно клипа с CGContextGetClipBoundingBox. Ссылка на CGContext и Руководство по программированию 2D кварца очень хорошо отражают эту тему. – sigsegv

+0

Да, установка [[UIColor orangeColor] установлена] была ошибкой. Я взял это и изменил [self frame] на прямой, но все равно не кубик. Мысли? – mbm29414

+0

Я новичок в задании вопросов здесь ... есть ли способ отметить это решение или он просто остается «открытым»? – mbm29414

ответ

1

Проблема заключается в следующей строкой:

CGContextFillEllipseInRect (контекст, [само кадр]);

Вы должны изменить это к следующему:

CGContextFillEllipseInRect (контекст, [самостоятельной оценки]);

Происхождение кадра - это левое верхнее угловое расположение вида в родительском. Таким образом, это может быть любое значение в пределах размера родительского представления.

Таким образом, при рисовании с рамкой вы будете компенсировать положение Fillellipse rect, которое оказывается за пределами видимого прямоугольника вида ручки.

Следовательно, вы ничего не смогли увидеть.

6

Это может работать:

- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    [[UIColor orangeColor] setFill]; 
    [[UIBezierPath bezierPathWithOvalInRect:rect] fill]; 
} 
+0

Ницца! Благодаря! Оно работает! – mbm29414

+0

следует помнить, что переданный прямоугольник не всегда является границей вида. Поэтому правильнее использовать [self bounds], а не rect. –

1

Что касается цвета, отображаемого как белый, это потому, что CGContextSetRGBFillColor() ожидает значений от 0.0 до 1.0 для значений цветового компонента (не 0-255). Итак, пройдя 100, вы эффективно проходили 1.0, создавая белый цвет.

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