2013-05-17 27 views
8

Tôi có UICollectionView và tôi đang cố gắng đặt hình nền bằng thuộc tính backgroundView dựa trên nếu có bất kỳ dữ liệu nào trong CollectionView hay không. Tôi có điều hướng sẽ thay đổi dữ liệu và tải lại chế độ xem bộ sưu tập (gọi số [self.collectionView reloadData]). Vì một số lý do tôi nhận được kết quả rất lạ. Thứ nhất, đôi khi tôi đặt thuộc tính nó xuất hiện trên đầu trang của các ô collectionView và che khuất chúng. Thứ hai khi tôi cố gắng thay đổi thuộc tính, nó không thay đổi trên màn hình. Đây là lái xe cho tôi hạt! Nó có vẻ như một điều đơn giản để thực hiện!Không thể thay đổi thuộc tính backgroundView trên UICollectionView

Vì vậy, trong Mã. Trong viewDidLoad cho UICollectionViewController

- (void)viewDidLoad { 
[self loadSections]; 
[self setupBackgroundView; 
} 

Phương pháp phần tải chỉ tải dữ liệu tôi đang sử dụng cho xem bộ sưu tập, mà sau đó cũng kêu gọi một phương pháp để thiết lập các quan điểm nền mà quyết định những gì xem thêm dựa trên nếu có bất kỳ dữ liệu như sau:

- (void)loadSections { 
[self loadPictures]; 
[self setupBackgroundImage]; 
} 

- (void)setupBackgroundImage { 
if ([self.sections count] == 0 || !self.sections) { 
    self.collectionView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"TakePhoto"]]; 
} 
else { 
    self.collectionView.backgroundView = nil; 
} 
} 

Bây giờ khi xem tải đầu tiên, nếu không có dữ liệu và do đó không có các tế bào để hiển thị các hình ảnh nền đi lên một cách chính xác. Sau đó tôi thay đổi dữ liệu và bây giờ tôi có một số ô để hiển thị, setupBackgroundImage được gọi và tôi có thể xác minh rằng thuộc tính backgroundImage được đặt thành nil (tôi thậm chí đã bị ngắt ở đây và đã kiểm tra giá trị và không phải là nil). NHƯNG hình nền vẫn hiển thị.

Ngoài ra nếu tôi thay đổi hình ảnh khác thành hình ảnh mới này sẽ không bao giờ được hiển thị.

Và thậm chí còn kỳ lạ hơn. Nếu tôi có một số ô được hiển thị và đặt hình nền thì hình ảnh này được hiển thị gọn gàng phía sau các ô. Nếu sau đó tôi tải lạiData bằng một tập dữ liệu mới, thì hình ảnh được hiển thị ở phía trước các ô, che khuất chúng. Tôi không có ý tưởng làm thế nào điều này xảy ra như sau đó xem nền nên được đằng sau tất cả những người khác.

Có ai biết tại sao điều này xảy ra không. Là nó nhận được lưu trữ ở bất cứ đâu? hay tôi chỉ làm điều gì đó ngớ ngẩn? Tôi đang mất tổng số ở đây - đã dành nhiều thời gian hơn việc viết bố cục tùy chỉnh mà nó sử dụng!

+0

Bất kỳ cơ hội nào nhiều 'UICollectionViews' đang được tạo và thêm dưới dạng xem phụ? Điều đó sẽ giải thích hành vi bạn đang thấy. – bobnoble

+0

Cảm ơn bạn đã bình luận bobnoble. Tôi cũng tự hỏi liệu điều này có thể xảy ra không. Theo như tôi có thể nói, từ cả hai kiểm tra thông qua mã và từ chạy công cụ phân bổ dụng cụ, sau đó không có, chỉ có một UICollectionView. – SimonB

+0

Bất kỳ cơ hội nào thiết lập của bạnBackgroundImage đôi khi được gọi trên một chuỗi khác với chuỗi chính? – honus

Trả lời

0

Ok, tôi tìm thấy một giải pháp cho vấn đề cụ thể của tôi, mặc dù tôi vẫn không hiểu tại sao tôi nhận được hành vi lạ đề cập trong câu hỏi của tôi, ít nhất là theo cách này cho phép tôi thay đổi hình nền.

Về cơ bản tôi tạo thuộc tính để giữ UIImageView và sau đó đặt UICollectionView thành thuộc tính này. Sau đó tôi có thể thay đổi hình ảnh trong chế độ xem hình ảnh thông qua thuộc tính mà tôi đã lưu.

- (void)viewDidLoad { 
    [self loadSections]; 
    self.backgroundImageView = [[UIImageView alloc] initWithImage:nil]; 
    self.backgroundImageView.contentMode = UIViewContentModeCenter; 
    self.collectionView.backgroundView = self.backgroundImageView; 
} 

- (void)setupBackgroundImage { 
    if ([self.sections count] == 0 || !self.sections) { 
     self.backgroundImageView.image = [UIImage imageNamed:@"TakePhoto"]; 
    } 
    else { 
      self.backgroundImageView.image = nil; 
    } 
} 

- (void)loadSections { 
    [self loadPictures]; 
    [self setupBackgroundImage]; 
} 

Trường hợp self.backgroundImageView là thuộc tính tôi đã xác định cho mục đích giữ tham chiếu đến chế độ xem nền.

Nếu có ai có bất kỳ thông tin chi tiết nào về hành vi lạ được đề cập trong câu hỏi, tôi thực sự muốn nghe nó!

+0

bạn có chắc chắn không phải là nền của bạn vấn đề định dạng hình ảnh? Tôi đã có cùng một vấn đề khi tôi đã cố gắng để thiết lập backgroudimage collecitoview. Nó hoạt động tốt sau khi tôi thay đổi để sử dụng một hình ảnh khác với định dạng png. self.CollectionView.backgroundView = [[UIImageVIew alloc] initWithImage: [UIImage imageNamed: @ "newPic"]]; –

3

Hãy thử điều này

self.collectionView.backgroundView =[[UIView alloc]initWithFrame:self.collectionView.bounds]; 
UIImageView *imgVW=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"TakePhoto"]]; 
[self.collectionView.backgroundView addSubView:imgVW]; 
0

Tôi không thực sự biết nếu điều này có liên quan nhưng tôi thấy điều này sau một tìm kiếm dài. Hy vọng điều này sẽ giúp ai đó tiết kiệm thời gian.

Như với UICollectionView, UITableView có chế độ xem nền được tạo trước khi AutoLayout. Nếu bạn sử dụng autoLayout, bạn nên đảm bảo backgroundView có khung.Nếu không thì sẽ biến mất. Trong lớp con di động của bạn, bạn có thể làm:

-(void)setBackgroundView:(UIView *)backgroundView 
{ 
    super.backgroundView = backgroundView; 
    self.backgroundView.translatesAutoresizingMaskIntoConstraints = NO; 
    [self.backgroundView autoPinEdgesToSuperviewEdgesWithInsets:UIEdgeInsetsZero]; 
} 
1

như đã chỉ ra trong bài này UICollectionView’s backgroundView property is horribly broken

người ta có thể có một đọc đắng khi cmd + click vào lớp UICollectionViewCell.


// The background view is a subview behind all other views. 
// If selectedBackgroundView is different than backgroundView, it will be placed above the background view and animated in on selection. 
@property (nonatomic, strong, nullable) UIView *backgroundView; 

hình mới của bạn được chèn bên dưới thẻ cũ. chỉ dành thời gian của tôi để gỡ lỗi và chửi thề rất nhiều cố gắng tìm ra những gì không hiệu quả.

chỉ cần sử dụng removeFromSuperview

Các vấn đề liên quan