расчет размера и положения изображения с помощью UIGraphicsBeginImageContext и drawRect для коллажа imageView в ios

Я пытаюсь создать коллаж с помощью UIGraphicsBeginImageContext. Но обрезка определенного положения изображения и размещение imageView в правильном положении в представлении сводит меня с ума. Моя попытка до сих пор:

-(void) viewWillAppear:(BOOL)animated
{
    [self noOfImages:2]; // no of images method used for how many image you want to show in the view. Currently I needed a collage imageView upto 3 images
}

-(void)noOfImages:(int)num
{
    if (num==2)
    {
        UIImageView *One=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height)];
        [One setBackgroundColor:[UIColor grayColor]];
        [One setImage:[UIImage imageNamed:@"1.jpg"]];

        UIImageView *Two=[[UIImageView alloc] initWithFrame:CGRectMake(containerView.frame.size.width/2, 0, containerView.frame.size.width/2, containerView.frame.size.height)];
        [Two setBackgroundColor:[UIColor grayColor]];

        NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"jpg"];
        UIImage *existingImage = [[UIImage alloc] initWithContentsOfFile:imagePath];


        // Create new image context (retina safe)
         UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, [UIScreen mainScreen].scale);

         // Create rect for image
         CGRect rect = CGRectMake(1, 0, containerView.frame.size.width, containerView.frame.size.height);

         // Draw the image into the rect
         [existingImage drawInRect:rect];

         // Saving the image, ending image context
         UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
         UIGraphicsEndImageContext();

        [Two setImage:newImage];


        [containerView addSubview:One];
        [containerView addSubview:Two];
    }

    else if (num==3)
    {
        UIImageView *One=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height)];
        [One setBackgroundColor:[UIColor grayColor]];
        [One setImage:[UIImage imageNamed:@"1.jpg"]];

        UIImageView *Two=[[UIImageView alloc] initWithFrame:CGRectMake(containerView.frame.size.width/2, 0, containerView.frame.size.width/2, containerView.frame.size.height/2)];
        [Two setBackgroundColor:[UIColor grayColor]];

        NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"jpg"];
        UIImage *existingImage = [[UIImage alloc] initWithContentsOfFile:imagePath];


        // Create new image context (retina safe)
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, [UIScreen mainScreen].scale);

        // Create rect for image
        CGRect rect = CGRectMake(1, 0, containerView.frame.size.width, 200);

        // Draw the image into the rect
        [existingImage drawInRect:rect];

        // Saving the image, ending image context
        UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        [Two setImage:newImage];

        UIImageView *Three=[[UIImageView alloc] initWithFrame:CGRectMake(containerView.frame.size.width/2, containerView.frame.size.height/2, containerView.frame.size.width/2, containerView.frame.size.height/2)];
        [Three setBackgroundColor:[UIColor grayColor]];

        NSString *imagePath3 = [[NSBundle mainBundle] pathForResource:@"3" ofType:@"jpg"];
        UIImage *existingImage3 = [[UIImage alloc] initWithContentsOfFile:imagePath3];


        // Create new image context (retina safe)
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, [UIScreen mainScreen].scale);

        // Create rect for image
        CGRect rect3 = CGRectMake(1, 0, containerView.frame.size.width, 200);

        // Draw the image into the rect
        [existingImage3 drawInRect:rect3];

        // Saving the image, ending image context
        UIImage * newImage3 = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        [Three setImage:newImage3];

        [containerView addSubview:One];
        [containerView addSubview:Two];
        [containerView addSubview:Three];
    }
}

Вывод для двух изображений должен быть:

введите здесь описание изображения

Вывод для трех изображений должен быть:

введите здесь описание изображения

На самом деле, когда я использую изображения 200x200, результаты верны. Но этот код не работает с динамическими изображениями, высота и ширина которых мне неизвестны. Также правое изображение немного растянуто и не находится в правильном положении для двух изображений. Позиция x изображения правой стороны должна начинаться от средней точки до конца, а не от начальной точки до середины. Я знаю, что мои расчеты неверны. Но невозможно установить правильную высоту, ширину, положение или кадрирование с помощью UIGraphicsBeginImageContextWithOptions или представления изображения, которое добавляется в качестве подпредставления.

Мне нужен вывод, например: для двух изображений - первая половина изображения слева, а другая половина изображения справа. для трех изображений - половина первого изображения слева, половина второго изображения вверху справа и половина третьего изображения внизу справа.


person Poles    schedule 22.05.2015    source источник
comment
Ваш вопрос не ясен. Нам нужно знать более конкретно, как вы хотите обрезать и разместить изображения. Вы показали изображения, но мы не знаем, как вы хотите, чтобы они выглядели, и что не так с изображениями, которые вы показываете.   -  person rdelmar    schedule 22.05.2015


Ответы (1)


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

person Dante Puglisi    schedule 22.05.2015