Tiled Background Image: Могу ли я сделать это с помощью UIImageView?

У меня есть полноэкранное фоновое изображение, которое черепично, т.е. оно должно воспроизводиться несколько раз по горизонтали и вертикали, чтобы сделать большой. Как в браузерах на уродливых домашних страницах;)

Является ли UIImageView моим другом для этого?

Ответ 1

Если я правильно понял ваш вопрос, вы можете использовать colorWithPatternImage: на UIColor, а затем установить цвет фона на UIView.

Если вы должны использовать UIImageView, вы можете сделать то же самое, но любое изображение, которое вы размещаете на изображении, будет рисовать перед фрагментированным изображением.

Ответ 2

Чтобы заставить alpha работать с образцом изображения, убедитесь, что у вас есть следующий набор:

view.backgroundColor = [UIColor colorWithPatternImage:aImage];
view.layer.opaque = NO;

Ответ 3

В течение многих лет я использовал подход Билла Дудни, но iOS 6 имеет гораздо лучшее решение. И... сегодня я нашел способ сделать эту работу над старыми версиями iOS тоже.

  • создайте новый класс "UIImage + Tileable" (копия/вставка источника ниже)
  • импортируйте это в любом классе, где вы хотите UIImageView с каменным изображением. Это категория, поэтому она "обновляет" все ваши UIImage в черепичные, используя стандартные звонки Apple.
  • когда вы хотите "черепичную" версию изображения, вызовите: "image = [image imageResizingModeTile]"

UIImage + Tileable.h

#import <UIKit/UIKit.h>

@interface UIImage (Tileable)

-(UIImage*) imageResizingModeTile;

@end

UIImage + Tileable.m

#import "UIImage+Tileable.h"

@implementation UIImage (Tileable)

-(UIImage*) imageResizingModeTile
{
    float iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];

    if( iOSVersion >= 6.0f )
    {
        return [self resizableImageWithCapInsets:UIEdgeInsetsZero resizingMode:UIImageResizingModeTile];
    }
    else
    {
        return [self resizableImageWithCapInsets:UIEdgeInsetsZero];
    }
}
@end

Ответ 4

Я использую вариацию решения @Rivera:

Поместите в расширение UIView следующее:

- (void)setColorPattern:(NSString *)imageName
{
    [self setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:imageName]]];
}

Затем вы можете установить фоновый рисунок в файле раскадровки /xib: Image showing how to set the colorPattern in the storyboard/xib

Ответ 5

Как мне очень нравится Interface Builder, я создал этот подкласс UIImageView для применения фальшивых фонов:

@interface PETiledImageView : UIImageView

@end

@implementation PETiledImageView

- (void)awakeFromNib
{
    [super awakeFromNib];

    UIImage * imageToTile = self.image;
    self.image = nil;
    UIColor * tiledColor = [UIColor colorWithPatternImage:imageToTile];
    self.backgroundColor = tiledColor;
}

@end

Я попытался переопределить setImage:, но, похоже, IB не вызывает его при декодировании файла Nib.

Ответ 6

Быстрая версия решения Daniel T. Вам все равно нужно установить значение keyPath в IB. Конечно, вы могли бы более тщательно развернуть дополнительный UIImage.

extension UIView {
    var colorPattern:String {
        get {
            return ""  // Not useful here.
        }
        set {
            self.backgroundColor = UIColor(patternImage: UIImage(named:newValue)!)
        }
    }
}

Ответ 7

В видео-сеансе WWDC 2018 № 219 "Лучшие практики работы с изображениями и графикой" инженер Apple явно рекомендует не использовать цвет рисунка для мозаичного фона:

Я рекомендую не использовать узорчатые цвета со свойством background color в UIView. Вместо этого создайте UIImageView. Присвойте свое изображение этому виду изображения. И используйте функции в UIImageView, чтобы правильно настроить параметры листов.

Так что лучший и самый простой способ создать мозаичный фон будет выглядеть так:

imageView.image = image.resizableImage(withCapInsets: .zero, resizingMode: .tile)

Или еще проще, если вы используете каталог ресурсов - выберите актив изображения шаблона и в инспекторе Атрибутов включите нарезку (по горизонтали/вертикали или оба), установите для вставок ноль, а ширину/высоту для размеров вашего изображения:

BJ0ax.png

затем просто назначьте это изображение вашему представлению изображения (также работает Interface Builder), просто не забудьте установить UIImageView contentMode в .scaleToFill.