UINavigationController: переход не плавный при нажатии больших изображений - PullRequest
1 голос
/ 09 октября 2011

Я новичок в разработке для iPhone, и у меня проблема с UINavigationControoler в моем приложении.

У меня есть список изображений из основного комплекта приложений в UITableView (с миниатюрами), и когда изображение выбрано, представление UIScrollView передается в контроллер навигации.Проблема возникает во время анимации с нажимным переходом, когда я использую большие изображения (например, те, которые сняты на камеру iPhone).Это не гладко (низкая частота кадров), поэтому мне интересно, в чем проблема (+ нет проблем с поп-переходом).Вот мой фрагмент кода из представления изображения:

- (void)loadView 
{
    //consider loading in seperate thread?
    //[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:[photo URL]];

    UIImage *image = [UIImage imageNamed :[photo URL]];
    imageView = [[UIImageView alloc] initWithImage:image];

    UINavigationController *navController = [self navigationController];

    //get navigation controller view frame
    CGRect scrollViewSize = self.navigationController.view.frame;

    //take navigation bar height into account for scroll view size
    if(![navController isNavigationBarHidden]) {
        scrollViewSize.size.height -= [[navController navigationBar] frame].size.height;
    } 

    //take status bar height into account for scroll view size}
    UIApplication *sharedApp = [UIApplication sharedApplication];
    if(![sharedApp isStatusBarHidden]) {
        scrollViewSize.size.height -= [sharedApp statusBarFrame].size.height;
    }

    //calculate minimum zoom scale
    CGSize screenSize = scrollViewSize.size;
    CGFloat widthRatio = screenSize.width / image.size.width;
    CGFloat heightRatio = screenSize.height / image.size.height;
    CGFloat initialZoom = (widthRatio > heightRatio) ? heightRatio : widthRatio;

    //init scroll view
    scrollView = [[PhotoScrollView alloc] initWithFrame:scrollViewSize];
    [scrollView setMaximumZoomScale:1.0];
    [scrollView setMinimumZoomScale:initialZoom];
    [scrollView setBouncesZoom:YES];
    [scrollView setContentSize :[image size]];
    [scrollView setScrollEnabled :YES];
    [scrollView setDelegate: self];

    //imageView has to be added to scrollView in order for setZoomScale to work
    [scrollView addSubview :imageView];

    [scrollView setZoomScale:initialZoom];

    imageDescription = [[UILabel alloc] initWithFrame:CGRectMake(0, (screenSize.height/2)-20, screenSize.width, 40)];
    [imageDescription setText:[[self photo] getDetails]];
    [imageDescription setFont:[UIFont systemFontOfSize:20]];
    [imageDescription setTextAlignment:UITextAlignmentCenter];
    [imageDescription setBackgroundColor:[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.5]];
    [imageDescription setAlpha:0];

    [image release];
    [super loadView];
}

- (void)viewDidLoad
{
    [self.view addSubview :scrollView];
    [self.view addSubview:imageDescription];
    [super viewDidLoad];
}

Я уже пытался загрузить изображение в отдельном потоке ([NSThread detachNewThreadSelector: @selector (loadImage :) toTarget: self withObject: [URL фотографии]]), ноэто не помогает.Должен ли я изменить размер изображения?Также мне интересно, как написано приложение iPhone для фотографий по умолчанию, потому что оно имеет схожую функциональность, но изображение при переходе размыто.

1 Ответ

1 голос
/ 09 октября 2011

Имейте в виду, что использование изображений, снятых камерой, занимает значительный объем памяти.Возьмите приложение Photos.app на iPhone.На самом деле они никогда не отображают вам оригинальную фотографию.Они снимают изображения нескольких размеров и, в зависимости от масштабного коэффициента (т. Е. Насколько вы увеличены), представляют фотографию с более высоким разрешением.Но при полном увеличении все равно вы не получите такое же разрешение, что и у исходного изображения, по этой самой причине: производительность.

Я настоятельно рекомендую посмотреть это видео WWDC 2010 , которое проходитэта концепция и значительно повысит производительность вашего приложения.

...