iPhone — расстояние CGPoint в пикселях и разрешение экрана

У меня есть этот код в методе - (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context (в подклассе MKOverlayView), чтобы предотвратить отрисовку сегментов длиной менее 10 пикселей на наложенной карте:

            CGPoint origin = [self pointForMapPoint:poly.points[0]];
            CGPoint lastPoint = origin;

            CGContextMoveToPoint(context, origin.x, origin.y);

            for (int i=1; i<poly.pointCount; i++) {
                CGPoint point = [self pointForMapPoint:poly.points[i]];

                CGFloat xDist = (point.x - lastPoint.x);
                CGFloat yDist = (point.y - lastPoint.y);
                CGFloat distance = sqrt((xDist * xDist) + (yDist * yDist)) * zoomScale;

                if (distance >= 10.0) {
                    lastPoint = point;
                    CGContextAddLineToPoint(context, point.x, point.y);
                }
            }

будет ли тест >= 10.0 заботиться о разрешении экрана, или я могу ввести какой-то параметр [UIScreen mainScreen].scale?


person Oliver    schedule 21.07.2011    source источник


Ответы (2)


Я считаю, что тест >= 10.0 не учитывает разрешение экрана. Apple выполняет большую часть своей арифметики рисования, используя «точки» вместо пикселей, поэтому код для дисплея Retina не должен меняться по сравнению с обычным дисплеем.

Если вы хотите нарисовать что-то шириной всего 10,0 пикселей, вам нужно будет учитывать разрешение экрана; однако, если вы сделаете это, вам придется написать метод для поддержки как дисплея сетчатки, так и обычного дисплея.

person Carter    schedule 21.07.2011
comment
Он находится в методе - (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context (подкласс MKOverlayView). Что ты думаешь я должен сделать ? - person Oliver; 21.07.2011
comment
Тест будет игнорировать разрешение экрана, поэтому вам нужно спросить, пытаетесь ли вы не рисовать что-то шириной 10 пикселей или что-то шириной 10 точек. Я бы использовал точки (потому что они лучше переключаются между устройствами), и тогда вам не нужно менять свой текущий код. - person Carter; 21.07.2011
comment
Я не хочу игнорировать это, мне нужна линия в пикселях, а не точка. я должен вставить свойство .scale? - person Oliver; 22.07.2011
comment
Да, тогда я думаю, вам следует добавить свойство .scale. Обязательно протестируйте его, чтобы убедиться, что он работает, но я думаю, что это сработает. - person Carter; 22.07.2011

Это зависит от того, как настроен графический контекст. Если это код рисования UIView, об этом позаботится масштабный коэффициент вида (который устанавливается автоматически), если вы рисуете в контексте растрового изображения, вам придется делать это вручную.

person omz    schedule 21.07.2011
comment
Он находится в методе - (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context (подкласс MKOverlayView). Могу ли я сделать что-то вроде ›= 10.0/self.view.scale? - person Oliver; 21.07.2011
comment
В документах больше ничего не упоминается, поэтому я предполагаю, что коэффициент масштабирования уже установлен в контексте. Кстати, этот метод работает в фоновом потоке, поэтому вам нужно быть немного осторожным. - person omz; 21.07.2011
comment
быть осторожным в чем? Какова связь между масштабом и тем фактом, что это фоновый поток? - person Oliver; 21.07.2011