Как я могу программно принудительно остановить прокрутку в UIScrollView?

Прежде всего, то, что вы делаете - это операция «map» (преобразование элементов одного массива в другой массив / список), а не операция «filter» (удаление определенных элементов, соответствующих условию, из массив / список).

Во-вторых, вы не должны зацикливаться на диапазоне. Это цикл for in, а не традиционный цикл for, поэтому здесь нет индекса. Вместо этого каждая итерация содержит элемент в списке / массиве.

artists = []
for track in songs['tracks']:
    artists.append(track['artists'][0]['name'])

Вы можете превратить это в однострочник, используя списки . Они принимают общую предпосылку итерации по списку для создания нового списка, возможно, трансформируя результаты и, возможно, фильтруя результаты. Синтаксис, который они используют:

result = [  for item in items if  ]

В вашем случае у вас нет явной необходимости в условии, поскольку вы просто отображаете один набор значений массива в другой, например:

[ 112]

Однако, если бы вы фильтровали, то если бы условие было тем, что вы бы использовали. Например

artists_with_long_songs = [ track[artists][0]['name'] for track in songs['tracks'] if track['length'] > 600 ]

74
задан Community 23 May 2017 в 12:26
поделиться

3 ответа

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

Обобщенное решение для любого действия с прокруткой:

- (void)killScroll 
{
    CGPoint offset = scrollView.contentOffset;
    offset.x -= 1.0;
    offset.y -= 1.0;
    [scrollView setContentOffset:offset animated:NO];
    offset.x += 1.0;
    offset.y += 1.0;
    [scrollView setContentOffset:offset animated:NO];
}

[Edit] Начиная с iOS 4.3 (и, возможно, ранее), это тоже работает

- (void)killScroll 
{
    CGPoint offset = scrollView.contentOffset;
    [scrollView setContentOffset:offset animated:NO];
}
100
ответ дан 24 November 2019 в 11:44
поделиться

Отключите просто взаимодействие с пользователем прокрутки. (быстро)

scrollView.isScrollEnabled = false

Отключают в во время анимации прокрутки после перетаскивания. (быстро)

var scrollingByVelocity = false

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    if !scrollingByVelocity {
        scrollView.setContentOffset(scrollView.contentOffset, animated: false)
    }
}
1
ответ дан 24 November 2019 в 11:44
поделиться

Самый простой способ - создать подкласс UIScrollView и предоставить свой собственный метод setContentOffset. Это должно передать сообщение, только , если вы не включили логическое свойство freeze .

Примерно так:

BOOL freeze; // and the @property, @synthesize lines..

-(void)setContentOffset:(CGPoint)offset
{
    if ( !freeze ) [super setContentOffset:offset];
}

Затем, чтобы заморозить:

scrollView.freeze = YES;
5
ответ дан 24 November 2019 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: