Установка размеров UIImage на изображении UITableViewCell
-
06-09-2019 - |
Вопрос
у меня стандарт UITableViewCell
где я использую свойства текста и изображения для отображения favicon.ico
и этикетка.По большей части это работает очень хорошо, поскольку UIImage
поддерживает формат ICO.Однако некоторые сайты (например, Amazon.com скажем) есть favicon.ico
s, которые используют способность формата ICO хранить несколько размеров в одном файле.Amazon хранит четыре разных размера, вплоть до 48x48.
В результате большинство изображений имеют размер 16x16, за исключением некоторых, которые имеют размер 32x32 или 48x48, из-за чего все выглядит ужасно.Я безуспешно искал здесь, на официальном форуме, в документации и где-либо еще.Я перепробовал все, что мог придумать, чтобы ограничить размер изображения.Единственное, что сработало, — это недокументированный метод, который я не собираюсь использовать.Это мое первое приложение и мой первый опыт работы с Cocoa (пришел из C#).
В случае, если мне неясно, что я ищу, в идеале совет будет сосредоточен на установке размеров UIImage
чтобы версия 48x48 уменьшалась до 16x16 или как-то это определить UIImage
использовать версию 16x16, присутствующую в файле ICO.Мне не обязательно нужен код:просто предложение подхода мне подойдет.
У кого-нибудь есть предложения?(Я спрашивал на официальном форуме также потому что я уже потратил на это больше суток.Если там будет опубликовано решение, я размещу его и здесь.)
Решение
Вот что пишет пользователь «bcd» на официальном форуме опубликовано в конечном итоге это решило проблему (с небольшой модификацией, сделанной мной, чтобы сделать ее статической для включения в набор служебных методов):
+ (UIImage *)scale:(UIImage *)image toSize:(CGSize)size
{
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}
Другие советы
Я делаю нечто подобное в своем приложении.
UIImage* resizedImage(UIImage *inImage, CGRect thumbRect)
{
CGImageRef imageRef = [inImage CGImage];
CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef);
if (alphaInfo == kCGImageAlphaNone)
alphaInfo = kCGImageAlphaNoneSkipLast;
CGContextRef bitmap = CGBitmapContextCreate (NULL, thumbRect.size.width, thumbRect.size.height, 8, thumbRect.size.width*3,
CGColorSpaceCreateDeviceRGB(), alphaInfo);
CGContextDrawImage(bitmap, thumbRect, imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
UIImage* result = [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return result;
}
Затем создайте новое изображение, сохраняя пропорции.Замена «изображения» файлом ICO, который вы получаете от Amazon.
CGRect sz = CGRectMake(0.0f, 0.0f, 16, 16);
UIImage *resized = resizedImage(image, sz);
У меня еще недостаточно кармы, чтобы комментировать ответы, но я добился хороших результатов с приведенным выше кодом bbrandons.
Я получил довольно много предупреждений на консоли, хотя настройка байтов на строку недостаточно высока - после прочтения ответов на этот вопрос. почта В итоге я установил его на 0, что позволяет системе определить правильное значение.
например:
CGContextRef bitmap = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, CGColorSpaceCreateDeviceRGB(), alphaInfo);
Вот как я это сделал.Этот метод обеспечивает перемещение текста и подробных текстовых меток влево:
@interface SizableImageCell : UITableViewCell {}
@end
@implementation SizableImageCell
- (void)layoutSubviews {
[super layoutSubviews];
float desiredWidth = 80;
float w=self.imageView.frame.size.width;
if (w>desiredWidth) {
float widthSub = w - desiredWidth;
self.imageView.frame = CGRectMake(self.imageView.frame.origin.x,self.imageView.frame.origin.y,desiredWidth,self.imageView.frame.size.height);
self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x-widthSub,self.textLabel.frame.origin.y,self.textLabel.frame.size.width+widthSub,self.textLabel.frame.size.height);
self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x-widthSub,self.detailTextLabel.frame.origin.y,self.detailTextLabel.frame.size.width+widthSub,self.detailTextLabel.frame.size.height);
self.imageView.contentMode = UIViewContentModeScaleAspectFit;
}
}
@end
...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[SizableImageCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
cell.textLabel.text = ...
cell.detailTextLabel.text = ...
cell.imageView.image = ...
return cell;
}
Я ничего не знаю о том, как работают ico-файлы, так что, возможно, можно легко извлечь изображение 16x16 и использовать его, но я понятия не имею, как это сделать.
Насколько мне известно, невозможно установить какие-либо полезные свойства изображения в общем виде. UITableViewCell
.Самый простой способ (все еще запутанный, особенно если вы новичок в этом деле) уменьшить все до 16x16 — это создать подкласс UITableViewCell
, дайте ему UIImageView
, всегда выбирайте размер изображения 16x16 и устанавливайте для его contentMode значение UIViewContentModeAspectFit
.
Я изменил категорию людей других людей, чтобы все изображения имели одинаковую ширину (видимую ширину) БЕЗ МАСШТАБИРОВАНИЯ:
-(UIImage*) centerImage:(UIImage *)inImage inRect:(CGRect) thumbRect
{
CGSize size= thumbRect.size;
UIGraphicsBeginImageContext(size);
//calculation
[inImage drawInRect:CGRectMake((size.width-inImage.size.width)/2, (size.height-inImage.size.height)/2, inImage.size.width, inImage.size.height)];
UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();
// pop the context
UIGraphicsEndImageContext();
return newThumbnail;
}