UICollectionView의 UIRefreshControl은 컬렉션이 컨테이너의 높이를 채우는 경우에만 작동합니다


142

나는를 추가하기 위해 노력하고있어 UIRefreshControlA를 UICollectionView하지만, 문제는 콜렉션 뷰는 부모 컨테이너의 높이를 채워하지 않는 한 리프레시 제어가 나타나지 않는다는 것입니다. 즉, 컬렉션보기가 스크롤을 요구할만큼 길지 않은 경우 풀다운하여 새로 고침 제어보기를 표시 할 수 없습니다. 컬렉션이 부모 컨테이너의 높이를 초과하자마자 컬렉션이 내려지고 새로 고침보기가 표시됩니다.

난 그냥와 빠른 아이폰 OS 프로젝트 설정 한 UICollectionView그래서 나는를 추가 할 수있는 컬렉션보기로 콘센트로, 기본보기 내부 UIRefreshControl에에 viewDidLoad. 재사용 식별자가있는 프로토 타입 셀도 있습니다cCell

이것은 컨트롤러의 모든 코드이며 문제를 잘 보여줍니다. 이 코드에서는 셀 높이를 100으로 설정하여 디스플레이를 채우기에 충분하지 않으므로 뷰를 가져올 수 없으므로 새로 고침 컨트롤이 표시되지 않습니다. 디스플레이를 채우려면 더 높은 것으로 설정하면 작동합니다. 어떤 아이디어?

@interface ViewController () <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [self.collectionView addSubview:refreshControl];
}

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 1;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    return [collectionView dequeueReusableCellWithReuseIdentifier:@"cCell" forIndexPath:indexPath];
}

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(self.view.frame.size.width, 100);
}


1
사용alwaysBounceVertical
onmyway133

답변:


395

이 시도:

self.collectionView.alwaysBounceVertical = YES;

에 대한 완전한 코드 UIRefreshControl

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.tintColor = [UIColor grayColor];
[refreshControl addTarget:self action:@selector(refershControlAction) forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];
self.collectionView.alwaysBounceVertical = YES;

1
놀랍게도, 그 줄은 정확한 수정이며 나머지 코드는 중요하지 않습니다. StackOverflow에서 나쁜 시작이 아닙니다! 건배!
Merott

7
그래, 문제 없어 내가 초보자 허라는 것이 분명합니다. 어쨌든 내가 당신의 게시물을 볼 때 같은 상황에 처한 것으로 밝혀졌습니다. 내가 해결책을 찾았을 때 나는 분명히 그것을 공유해야한다. 건배
래리

6
후안, 아마 당신은 이미 당신의 질문에 대한 답을 찾았을 것입니다. 그러나 새로 고침 후 새로 고침 컨트롤을 정상 상태로 되돌리려면을 호출해야합니다 [refreshControl endRefreshing].
Merott

2
불행히도 더 이상 지원되지 않습니다. UIRefreshControl은 UITableViewController에서만 사용할 수 있으며 이제는 엄격하게 적용됩니다.
Luke Van

3
iOS 10에서 UIScrollView(의 superview UICollectionView) refreshControl속성은 현재 developer.apple.com/videos/play/wwdc2016/219/?time=2033
Streeter


23

래리의 신속한 답변 :

    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = UIColor.blueColor()
    refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
    collectionView.addSubview(refreshControl)
    collectionView.alwaysBounceVertical = true

스위프트 3 :

    let refreshControl = UIRefreshControl()
    refreshControl.tintColor = .blue
    refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
    collectionView.addSubview(refreshControl)
    collectionView.alwaysBounceVertical = true

Const는 정의되지 않은 변수의 오류를 제공합니다. 누군가 같은 상황이 발생하면 UIColor.whiteColor()원하는 색상으로 바꾸십시오 .
파이잘

1
Swift 2.2 용action: #selector(self.refresh)
파이살

1

귀하의 경우 collectionview세로로 스크롤 할 수있는 컨텐츠 크기 큰의 충분한을 가지고, 그것의 OK,하지만 귀하의 경우에는 그렇지 않다.

당신은 속성을 설정해야합니다 AlwaysBounceVertical, 그래서 당신은 설정할 수 있습니다self.collectionView.alwaysBounceVertical = YES;


0

나도 같은 문제에 직면했습니다. 의 콘텐츠 크기가 세로로 스크롤하기에 충분할 UIRefreshControl때까지 를 사용할 수 없었습니다 UICollectionView.

해결 된 bounces속성 설정UICollectionView

[self.collectionView setBounces:YES];
[self.collectionView setAlwaysBounceVertical:YES];

0

beginRefreshing()바로 다음에 전화 viewDidLoad()하지만 일부 화면에서는 작동하지 않습니다. 그리고 만 collectionView.layoutIfNeeded()에이 viewDidLoad()절 도와 줬어요


0

컬렉션 뷰가 새로 고침 상태 인 경우 API 호출을 확인한 다음 새로 고침 제어를 해제하려면 새로 고침을 종료해야합니다.

private let refreshControl = UIRefreshControl()
 refreshControl.tintColor = .white
 refreshControl.addTarget(self, action: #selector(refreshData), for: .valueChanged)
 collectionView.addSubview(refreshControl)
 @objc func refreshData() {
    // API Call
 }
// Disable refresh control if already refreshing 
if refreshControl.isRefreshing {
    refreshControl.endRefreshing()
}

스토리 보드 파일에서 스크롤 바운스가 활성화되었습니다.
Asad Jamil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.