плавне прокручування зображення

Я додав зображення для динамічного перегляду. Нижче наведено код:

-(void)displayimages {
    for (int i=0; i<[featuredarray count]; i++) {
        NSString *image=[[featuredarray objectAtIndex:i]objectForKey:@"img"];

        if (i==0) {
            webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*290+15, 0, 270, 380)];
        }
        else {
            webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*290+15, 0, 270, 380)];
        }
        webview.backgroundColor=[UIColor clearColor];
        webview.layer.borderWidth=4;
        webview.layer.cornerRadius=4;
        webview.layer.borderColor=[[UIColor whiteColor]CGColor];
        [webview setTag:i];
        webview.userInteractionEnabled=YES;
        NSURL *url = [NSURL URLWithString:image];
        [webview setImageWithURL:url placeholderImage:[UIImage 
           imageNamed:@"placeholder.png"]];
        [scroll addSubview:webview];

        UITapGestureRecognizer *tap1 =
        [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handlefirstTap:)];
        tap1.delegate=self;
        tap1.numberOfTapsRequired=1;
        [webview addGestureRecognizer:tap1];
        [tap1 release];
        [webview release];
   }

   pages.defersCurrentPageDisplay=YES;
   scroll.delegate =self;

   scroll.contentSize = CGSizeMake(290*[featuredarray count],300);
   scroll.pagingEnabled = YES;
   pages.numberOfPages = [featuredarray count]-1;
   pages.currentPage =0;
}

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    int gallerypage = scrollView.contentOffset.x /scrollView.frame.size.width;
    CGRect frame = scroll.frame;
    frame.origin.x = frame.size.width-15*gallerypage;
    NSLog(@"frame.origin.x..%f",frame.origin.x);
    frame.origin.y =0;
    [scroll scrollRectToVisible:frame animated:YES];
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    int gallerypage = scrollView.contentOffset.x /scrollView.frame.size.width;
    CGRect frame = scroll.frame;
    frame.origin.x=gallerypage*290;
    frame.origin.y =0;
    [scroll scrollRectToVisible:frame animated:YES];
}

Він показує зображення добре, коли я використовую дію pagecontroller

-(IBAction)pagecontrolaction:(id)sender {
    int page = pages.currentPage;
    CGRect frame = scroll.frame;
    frame.origin.x=page*290;
    frame.origin.y =0;
    [scroll scrollRectToVisible:frame animated:YES];
}

але коли я використав подію дотику до imageview, то зображення не відображається плавно. Він застряє під час прокрутки.

Це попередній перегляд, який показує поточне зображення з початком другого зображення.

3
ознайомтеся з посібником тут його роботи плавно edumobile.org/ iphone/iphone-programming-tutorials/& hellip;
додано Автор iphonemaclover, джерело
Просто вам потрібно прокоментувати метод scrollViewWillBeginDecelarating: , і він буде працювати. Я думаю, що ви намагаєтеся виконати пейджингове прокручування в методах scrollViewDelegate . Чому б не спробувати зробити pagesEnabled: у ваш scrollView ? Чому ви хочете винаходити колесо?
додано Автор Dinesh Raja, джерело
Що означає «Це застряє»? Зависає програма? Чи призупиняється вона на частку секунди, а потім продовжує прокручуватися? Чи просто зупиняється з новим зображенням частково на екрані, коли ви піднімаєте палець, замість прокручування нового зображення повністю на екран?
додано Автор rob mayoff, джерело
У вашому відео він не виглядає як пауза. Схоже, що перегляд прокрутки повертається назад, а потім знову вперед.
додано Автор rob mayoff, джерело
Чи все ще заїкається, якщо ви вилучите методи scrollViewWillBeginDecelerating: і scrollViewWillBeginDecelerating: ?
додано Автор rob mayoff, джерело
встановити кадр webview, як моя відповідь
додано Автор Bhavesh Nayi, джерело
@MinkleGarg Спробуйте використовувати один і той же UITapGestureRecognizer, не оголошуючи його кожного разу, і використовуйте тег, щоб розпізнати, який з них торкнутися.
додано Автор Omarj, джерело
Спробуйте збільшити тривалість анімації [scrollRectToVisible: анімація кадрів: YES], а потім перевірте, що відбувається
додано Автор Gyanendra, джерело
тоді він не відображає зображення ( fileswap.com/dl/8UF7RANTrD ), оскільки має бути. Позначте це посилання, яке показує неправильне зображення @robmayoff
додано Автор Minkle Garg, джерело
Хммм, як зробити прокрутку згладжування так само, як і його робота з роботою контролера сторінки @robmayoff
додано Автор Minkle Garg, джерело
@robmayoff перевірте це відео
додано Автор Minkle Garg, джерело
Він зупинився на дріб, а потім прокрутив @robmayoff
додано Автор Minkle Garg, джерело

8 Відповіді

Два способи: scrollViewWillBeginDecelerating і scrollViewDidEndDecelerating містять дві анімації з різною позицією x, анімована до:

frame.origin.x = frame.size.width-15*gallerypage;

і

frame.origin.x=gallerypage*290;

Краще, якщо ви можете вимкнути або функцію: scrollViewWillBeginDecelerating або scrollViewDidEndDecelerating. В іншому випадку, можливо, вам слід налаштувати положення x (повинно бути синхронізовано для обох функцій), яке буде анімоване.

1
додано

Я думаю, що це відбувається тому, що ваші зображення мають більший розмір (МБ), і ви розміщуєте їх у тому, що CGRect не змінюватиме їх розмір, а також важливо, скільки зображень, які ви завантажили у вікно перегляду, Ви завантажуєте багато фотографій, це займе багато пам'яті, і воно буде повільно ковзати.

0
додано

Ви обов'язково повинні змінити розмір зображення у фоновому режимі до завантаження його в UIImageView. Крім того, ви повинні встановити режим вмісту UIImageView на незмінює розмір. Це дозволило мені значно покращити прокручування після того, як були реалізовані інші способи (async cache та інші).

0
додано

Я не впевнений, чому ви встановлюєте кадр, коли ви починаєте прокручувати, але якщо б я був на вашому місці, я б зробив логіку, як показано нижче:

-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
   //do nothing
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    int gallerypage = scrollView.contentOffset.x /scrollView.frame.size.width;
    CGFloat xoffset = 290 * gallerypage;
    [UIView animateWithDuration:0.5
                     animations:^{
                         scrollView.contentOffset = CGPointMake(xoffset, 0);
                     } 
                     completion:^(BOOL finished){
                         NSLog(@"Done!");
                     }];
}

Сподіваюся, що це допоможе.

0
додано
if (i==0) {
            webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*320, 0, 270, 440)];
        }
        else {
            webview=[[UIImageView alloc]initWithFrame:CGRectMake(i*320, 0, 270, 380)];
        }
0
додано
Одночасно відображатиметься лише одне зображення. але мені потрібно поточне зображення + початок другого зображення.
додано Автор Minkle Garg, джерело

Ви повинні перевірити SYPaginator (SYPaginator - це горизонтальний TableView з ледачим завантаженням та переглядом утилізації).

Простий перегляд прокрутки для полегшення складних завдань. Ми використовуємо   це в деяких синтетичних додатках, включаючи Hipstamatic, D-Series,   і IncrediBooth.

Якщо вам потрібно більше можливостей, вам слід надати MSCachedAsyncViewDrawing спробу:

Допоміжний клас, який дозволяє малювати (a) синхронно з a   UIImage з кешуванням для великої продуктивності.

0
додано

Це відбувається, коли ви намагаєтеся показати зображення більшого розміру, у такому випадку ви повинні використовувати кеш, щоб отримати зображення там і спробувати завантажити зображення звідти. Для краще знати, як використовувати його .. використання SDwebimage це хороший спосіб зробіть це, і це швидко. Ви можете прочитати

  1. Lazy Loading

    2.paging enabled.

https://github.com/rs/SDWebImage

Вам потрібна додаткова допомога.

0
додано

Вам потрібно змінити вашу реалізацію для завантаження зображень з віддаленого ресурсу, тобто там, де лежить найбільша шийка пляшки.

Я не хочу вдаватися до деталей, але намагаюся замінити цей рядок коду

[webview setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

З чимось більш дружнім c.p.u. Використовуйте механізм кешування, який використовує багатопоточність, то, що ви хочете зробити, це перенести важку роботу (завантаження віддалених зображень) на інший потік.

SDWebImage робить ідеальну роботу на цьому https://github.com/rs/SDWebImage Якщо ви є жорстким ядром, ви можете скористатися власним багатопоточним завантажувачем зображень

[NSURLConnection sendAsynchronousRequest:queue: completionHandler:] 

And do the image loading in the block, Or even better dispatch_async(queu, block)

0
додано
Я мав на увазі, setImageWithURL: вже асинхронний виклик. Так що ІМХО нічого не турбує про це.
додано Автор Dinesh Raja, джерело
у AFNetworking цей метод асинхронно завантажує зображення у фоновому режимі і встановлює зображення в головному потоці. Іншого шляху, на мою думку, немає. перевірте це. engineering.gowalla.com/AFNetworking/Categories/…
додано Автор Dinesh Raja, джерело
Я думаю, що метод setImageWithURL: викликатиме себе в NSURLConnection . Це виглядає як метод з AFNetworking , популярного відкритого джерела в github для обробки мережних викликів.
додано Автор Dinesh Raja, джерело
@DineshRaja Я не впевнений, що він називає бути точно, але те, що я впевнений в тому, що цей метод є синхронним викликом, синхронні дзвінки погані, навіть коли виштовхується до фонового потоку, це не правильна багатопотокова парадигма.
додано Автор Edwin, джерело
IT KPI iOS
IT KPI iOS
74 учасників

Чат обсуждения IOS. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/602

ios_jobs_ua
ios_jobs_ua
27 учасників

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.