2013-05-17 7 views
8

पर मेरे पास UICollectionView है और मैं BackgroundView में कोई डेटा मौजूद है या नहीं, पृष्ठभूमि पृष्ठभूमि का उपयोग करके पृष्ठभूमि छवि सेट करने का प्रयास कर रहा हूं। मेरे पास नेविगेशन है जो डेटा को बदल देगा, और संग्रह दृश्य को पुनः लोड करेगा ([self.collectionView reloadData] पर कॉल करना)। किसी कारण से मुझे बहुत अजीब परिणाम मिल रहे हैं। सबसे पहले, कभी-कभी जब मैं संपत्ति सेट करता हूं तो यह संग्रह कक्ष के शीर्ष पर दिखाई देता है और उन्हें अस्पष्ट करता है। दूसरा, जब मैं संपत्ति को बदलने की कोशिश करता हूं तो यह स्क्रीन पर नहीं बदलता है। यह मुझे पागल कर रहा है! यह लागू करने के लिए एक आसान बात लग रहा था!पृष्ठभूमि बदलने में असमर्थ UICollectionView

तो कोड में। UICollectionViewController

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

के लिए viewDidLoad में लोड वर्गों विधि सिर्फ डेटा मैं संग्रह देखने के लिए, जो तब भी पृष्ठभूमि दृश्य जिसके आधार पर जोड़ने के लिए अगर वहाँ क्या देखने का फैसला करता है स्थापित करने के लिए एक विधि कॉल के लिए उपयोग कर रहा हूँ लोड करता है नीचे के रूप में किसी भी डेटा:

- (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; 
} 
} 

अब जब दृश्य पहली बार लोड, अगर वहाँ कोई डेटा और इसलिए कोई कोशिकाओं प्रदर्शित करने के लिए पृष्ठभूमि छवि सही ढंग से आता है। मैं फिर डेटा बदलता हूं और अब मेरे पास दिखाने के लिए कुछ सेल्स हैं, सेटअप बैकग्राउंड इमेज कहा जाता है और मैं यह सत्यापित कर सकता हूं कि पृष्ठभूमि इमेज प्रॉपर्टी शून्य पर सेट है (मैंने यहां भी तोड़ दिया है और मूल्य की जांच की है और यह शून्य है)। लेकिन पृष्ठभूमि छवि अभी भी दिखाई दे रही है।

इसके अतिरिक्त यदि मैं नील को दूसरी छवि में बदलता हूं तो यह नई छवि कभी नहीं दिखायी जाती है।

और इससे भी अधिक अजीब। अगर मेरे पास कुछ कक्ष प्रदर्शित होते हैं और पृष्ठभूमि छवि सेट करते हैं तो यह छवि कोशिकाओं के पीछे अच्छी तरह से प्रदर्शित होती है। यदि मैं फिर डेटा को एक नए डेटा सेट के साथ पुनः लोड करता हूं, तो छवियों को कोशिकाओं के सामने प्रदर्शित किया जाता है, जिससे उन्हें अस्पष्ट किया जाता है। मुझे नहीं पता कि यह कैसे होता है तब पृष्ठभूमि दृश्य सभी के पीछे होना चाहिए।

क्या कोई जानता है कि यह क्यों हो रहा है। क्या यह कहीं भी कैश हो रहा है? या मैं बस कुछ मूर्खतापूर्ण कर रहा हूँ? मैं यहां कुल नुकसान में हूं - इस पर कस्टम लेआउट लिखने के बजाय इस पर अधिक समय बिताया है!

+0

कोई मौका कई का उपयोग 'UICollectionViews' बनाए जा रहे हैं और subviews के रूप में जोड़ा? इससे आप जो व्यवहार देख रहे हैं उसे समझाएंगे। – bobnoble

+0

टिप्पणी bobnoble के लिए धन्यवाद। मैंने यह भी सोचा कि क्या यह हो सकता है। जहां तक ​​मैं कह सकता हूं, दोनों कोड के माध्यम से और चल रहे उपकरण आवंटन उपकरण से, फिर नहीं, केवल एक UICollectionView है। – SimonB

+0

कोई भी मौका आपके सेटअप बैकग्राउंड इमेज को कभी-कभी मुख्य धागे के अलावा किसी धागे पर बुलाया जा रहा है? – honus

उत्तर

0

ठीक है की कोशिश करो, मैं अपनी विशिष्ट समस्या का समाधान मिल गया है, हालांकि मैं अभी भी समझ में नहीं आता क्यों मुझे अजीब व्यवहार मेरे सवाल में उल्लेख हो रही है, कम से कम इस तरह से मेरे लिए अनुमति देता है पृष्ठभूमि छवि बदलें।

मूल रूप से मैं UIImageView रखने के लिए एक संपत्ति बनाता हूं और फिर UICollectionView को इस संपत्ति में सेट करता हूं। इसके बाद मैं छवि को सहेजने वाली संपत्ति के माध्यम से छवि दृश्य में बदल सकता हूं।

- (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]; 
} 

कहाँ self.backgroundImageView संपत्ति मैं पृष्ठभूमि दृश्य के लिए एक संदर्भ रखने के उद्देश्य के लिए परिभाषित किया गया है।

यदि किसी के पास इस प्रश्न में उल्लिखित अजीब व्यवहार में कोई अंतर्दृष्टि है तो मुझे वास्तव में यह सुनना होगा!

+0

क्या आप सुनिश्चित हैं कि यह आपकी पृष्ठभूमि नहीं है छवि प्रारूप मुद्दा? जब मैंने collecitoview backgroudimage को स्थापित करने का प्रयास किया तो मुझे एक ही समस्या थी। पीएनजी प्रारूप के साथ एक अन्य तस्वीर का उपयोग करने के बाद बदल गया यह ठीक काम करता है। self.CollectionView.backgroundView = [[UIImageVIew alloc] initWithImage: [UIImage imageNamed: @ "newPic"]]; –

3

इस

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

मुझे वास्तव में पता नहीं है कि यह संबंधित है या नहीं, लेकिन मुझे यह एक लंबी खोज के बाद मिला। उम्मीद है कि यह किसी को कुछ समय बचाता है।

एक यूआईसीओलेक्शन व्यू के साथ एक UITableView में पृष्ठभूमि दृश्य है जो ऑटोलाउट से पहले बनाया गया है। यदि आप ऑटोलाउट का उपयोग करते हैं तो आपको यह सुनिश्चित करना चाहिए कि पृष्ठभूमि दृश्य में एक फ्रेम है।अन्यथा गायब हो जाएगा। अपने सेल उपवर्ग में आप कर सकते हैं:

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

के रूप में इस पोस्ट UICollectionView’s backgroundView property is horribly broken

एक में बताया जब cmd + 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; 

आपका नया एक पुराना नीचे डाला गया है। बस अपना आखिरी घंटा डिबगिंग बिताया और यह पता लगाने की कोशिश कर रहा था कि क्या काम नहीं कर रहा है।

सिर्फ removeFromSuperview

संबंधित मुद्दे