iPhone: изображение Посмотреть ограничение размера изображения - PullRequest
2 голосов
/ 24 января 2010

Эй, ребята, сначала я получил изображение в виде изображения, которое было 2900x2100, и размер файла был около 4 МБ. У меня также был вид прокрутки для перемещения по изображению. В любом случае это потерпело крах, сначала я думал, что это было, потому что размер 4 МБ. Затем я изменил его размер, сделав его размером 1287x1234 и 1,3 МБ, но он был пикселирован при слишком большом увеличении. После этого мне удается сделать это 2900x2100 с 1,5 МБ! поэтому я запустил его на своем устройстве, и он все еще падает !!

Кто-нибудь знает, почему это? Это то, что я получаю на консоли отладчика

Программный полученный сигнал: «0».

предупреждение: check_safe_call: не удалось восстановить текущий кадр

вот больше информации, это мой метод viewDidLoad:

UIImageView * tempimage = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @ "sanlucasFLAT.jpg"]];

self._FLatLucasImageView = tempimage;

[временное освобождение];

_FLatLucasImageView.frame = CGRectMake (-7, 0, 800, 800);

_FLatLucasImageView.contentMode = UIViewContentModeScaleAspectFit;

_FlatLucasScrollView.contentSize = CGSizeMake (_FLatLucasImageView.frame.size.width, _FLatLucasImageView.frame.size.height);

_FlatLucasScrollView.delegate = self;

_FlatLucasScrollView.clipsToBounds = YES;

[_ FlatLucasScrollView addSubview: _FLatLucasImageView];

[_ FLatLucasImageView release];

Когда я устанавливаю CGRectMake в: (0,0,2900,2961), он не падает при прокрутке изображения

С наилучшими пожеланиями

Карлос Варгас

Ответы [ 3 ]

5 голосов
/ 25 января 2010

Причина сбоя вашего приложения в том, что изображение, которое вы используете, слишком велико.
В соответствии со ссылкой на класс для UIImage, это говорит, что Вы должны избегать создания объектов UIImage, которые имеют размер больше 1024 x 1024 .

Если вы добавите объект UIImage с изображением большего размера, чем 1024 x 1024, в объект UIImageView, ваше приложение может аварийно завершить работу. Если вам повезет, иногда ваше приложение не падает, хотя.

3 голосов
/ 25 января 2010

Размер файла вашего изображения здесь не имеет значения: UIImage должен будет распаковать его и сохранить распакованное изображение в памяти. Обычно требуется 4 байта для каждого пикселя, что означает, что изображение размером 2900 x 2100 пикселей займет более 24 МБ памяти. На iPhone или iPhone 3G у вас может даже не хватить памяти для вашей целой программы.

Возможно, попробуйте разделить его на более мелкие изображения, а затем загрузить их по мере необходимости, когда пользователь прокручивает ваш вид. Просто нарежьте его на плитки размером примерно 320x480 (размер экрана iPhone), а затем добавьте только видимые плитки в UIScrollView и удалите их, когда пользователь прокручивает страницу, и они становятся невидимыми.

1 голос
/ 24 января 2010

Этот код очень грязный. Пара вещей:

  • Старайтесь не использовать переменные экземпляра с префиксом подчеркивания (полуприватное яблоко)
  • Старайтесь не использовать переменные экземпляра, начинающиеся с заглавной буквы (соглашение, вещи, начинающиеся с заглавной буквы, обычно являются классами или типами)
  • Не определяйте свойства для переменных экземпляра, которые вы фактически не выставляете. Если это просто вещи для вашего класса, то вам не нужно свойство.

При этом я предполагаю, что вы переиздаваете изображение. Попробуйте удалить этот последний [_FLatLucasImageView release].

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

UIImage* image = [UIImage imageNamed: @"sanlucasFLAT.jpg"];
if (image != nil)
{
    UIImageView* imageView = [[[UIImageView alloc] initWithImage: image] autorelease];
    if (imageView != nil)
    {
        imageView.frame = CGRectMake(-7, 0, 800, 800);
        imageView.contentMode = UIViewContentModeScaleAspectFit;

        flatLucasScrollView.contentSize = CGSizeMake(imageView.frame.size.width, imageView.frame.size.height);
        flatLucasScrollView.delegate = self;
        flatLucasScrollView.clipsToBounds = YES;

        [flatLucasScrollView addSubview: imageView];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...