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
.