Прежде всего, то, что вы делаете - это операция «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 ]
Я немного поигрался с вашим исходным решением, и, похоже, оно отлично работает. Я думаю, у вас это почти получилось, но вы просто смещали прямоугольник, который вы использовали слишком много, и забыли, что вы можете просто прокрутить прямоугольник прямо до исходного прямоугольника.
Обобщенное решение для любого действия с прокруткой:
- (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];
}
scrollView.isScrollEnabled = false
var scrollingByVelocity = false
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
if !scrollingByVelocity {
scrollView.setContentOffset(scrollView.contentOffset, animated: false)
}
}
Самый простой способ - создать подкласс UIScrollView и предоставить свой собственный метод setContentOffset. Это должно передать сообщение, только , если вы не включили логическое свойство freeze
.
Примерно так:
BOOL freeze; // and the @property, @synthesize lines..
-(void)setContentOffset:(CGPoint)offset
{
if ( !freeze ) [super setContentOffset:offset];
}
Затем, чтобы заморозить:
scrollView.freeze = YES;