Nano Hash - криптовалюты, майнинг, программирование

Ориентация изображения MKAnnotationView

У меня есть MKMapView, в котором я могу иметь несколько ARDVenueAnnotationView (подкласс MKAnnotationView) с пользовательским изображением с одинаковыми координатами. Таким образом, эти аннотации перекрываются. Что я сделал для этого, так это изменил anchorPoint слоя аннотации. Это работает как изображение ниже (4 центрированные аннотации имеют одинаковые координаты):

Кроме того, я хотел бы, чтобы аннотации изменили ориентацию изображения, чтобы маленький хвост изображения указывал на координату (не обращайте внимания на порядок аннотаций):

Вот моя проблема, когда я setImage: в своем представлении аннотации, создавая это изображение с помощью + (UIImage *)imageWithCGImage:scale:orientation:, ориентация не меняется. Вот мой код, который обновляет изображение:

- (void)updateImage
{
    UIImage *selectedImage = [UIImage imageNamed:@"redPin"];
    if (!self.isCluster && self.selected) {
        selectedImage = [UIImage imageNamed:@"whitePin"];
    }

    UIImageOrientation orientation;

    switch (self.anchorCorner) {
        case ARDVenueAnnotationAnchorCornerBottomLeft:
            orientation = UIImageOrientationUpMirrored;
        break;

        case ARDVenueAnnotationAnchorCornerTopLeft:
            orientation = UIImageOrientationDown;
        break;

        case ARDVenueAnnotationAnchorCornerTopRight:
            orientation = UIImageOrientationDownMirrored;
        break;

        default:
            orientation = UIImageOrientationUp;
        break;
    }
    UIImage *image = [[UIImage alloc] initWithCGImage:selectedImage.CGImage scale:selectedImage.scale orientation:orientation];
    [self setImage:image];
}

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

Когда я добавляю UIImageView в качестве подвида моего представления аннотации, он показывает правильную ориентацию изображения (как показано на втором рисунке).

Мои вопросы :

Почему setImage: не учитывает ориентацию изображения? А может я что-то не так делаю...

Как я могу добиться этого, не добавляя UIImageView в качестве подвида? в конце концов, свойство image здесь не просто так


Ответы:


1

Попробуйте создать изображение с исходным изображением с кодом:

static inline double radians (double degrees) {return degrees * M_PI/180;}
-(UIImage*) image :(UIImage*) src withOrientation: (UIImageOrientation) orientation
{
    UIGraphicsBeginImageContext(src.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (orientation == UIImageOrientationRight) {
        CGContextRotateCTM (context, radians(90));
    } else if (orientation == UIImageOrientationLeft) {
        CGContextRotateCTM (context, radians(-90));
    } else if (orientation == UIImageOrientationDown) {
        // NOTHING
    } else if (orientation == UIImageOrientationUp) {
        CGContextRotateCTM (context, radians(90));
    }

    [src drawAtPoint:CGPointMake(0, 0)];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

Вам также может понадобиться перевернуть изображение, поэтому используйте этот код:

UIImage* flippedImage = [UIImage imageWithCGImage:image.CGImage 
                                            scale:image.scale
                                      orientation:UIImageOrientationUpMirrored]; 
11.03.2015
  • Спасибо за ваш ответ, ваш код, который перерисовывает изображение, работает нормально, за исключением того, что я использовал UIGraphicsBeginImageContextWithOptions(src.size, NO, src.scale); для сохранения масштаба исходного изображения. Почему мы должны перерисовывать новое изображение, чтобы использовать его для MKAnnotationView? 13.03.2015
  • Это немного глючит, вы не можете вращать MKAnnotation напрямую. и, пожалуйста, примите мой ответ как правильный. 16.03.2015
  • Это самый простой ответ и на самом деле не отвечает на мой вопрос. Но ладно, принято 16.03.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..