2013-01-31 9 views
16

यह एक आसान समस्या की तरह लगता है, लेकिन मैं एक ईंट की दीवार पर पहुंच जाते हैं एक समाधान खोजने और मैं आशा करती हूं यहां पर किसी की मदद कर सकते हैं ...1 पिक्सेल की खाई

मैं एक UITableView UITableViewStyleGrouped का उपयोग कर बनाने रहा हूँ, और मैं एक छोटे से (1 पिक्सेल) सफेद मेरी तालिका दृश्य के हर खंड की पहली और दूसरी पंक्ति के बीच की रेखा दिखाई दे रहा है (छवि देखें)

example of gap

ऐसा लगता है कि कारण इस पंक्ति के लिए यह है कि प्रत्येक खंड में पहला कक्ष दूसरों की तुलना में 1 पिक्सेल लंबा है। जब मैं प्रत्येक समूह का प्रारंभिक कक्ष 2 9 पिक्सेल ऊंचा (अन्य 30) होता हूं तो अंतराल गायब हो जाता है और सब ठीक है।

हालांकि यह कामकाज सफल है, लेकिन मैं इसके होने का कारण जानना चाहता हूं इसलिए मैं एक गन्दा हैक का उपयोग करने से बच सकता हूं।

FYI करें

:

  • मैं का उपयोग करके यकीन है कि यह मेरे पास है पृष्ठभूमि छवियों के साथ कोई समस्या नहीं है बना दिया है - वे सभी 30px उच्च रहे हैं, और मैं एक ही साथ एक मध्यम छवि के साथ शीर्ष छवि जगह ले ली है परिणाम।
  • मैं separatorStyle = UITableViewCellSeparatorStyleNone
  • इस आशय की स्थापना द्वारा कोशिकाओं के बीच सभी सीमाओं को हटा दिया है UITableViewStylePlain

किसी भी मदद की बहुत सराहना कर रहा है पर नहीं होता है।

धन्यवाद

तालिका सेटअप के लिए कोड:

myTable = [[UITableView alloc] initWithFrame:CGRectMake(TABLE_SHIFT_OFFSET, 
                  DATE_SLIDER_HEIGHT - DATE_SLIDER_SHADOW_HEIGHT, 
                  326, 
                  self.view.frame.size.height - DATE_SLIDER_HEIGHT + DATE_SLIDER_SHADOW_HEIGHT) style:UITableViewStyleGrouped]; 
    myTable.backgroundColor = [UIColor clearColor]; 
    myTable.backgroundView = nil; 
    myTable.separatorStyle = UITableViewCellSeparatorStyleNone; 
    [self.view addSubview:myTable]; 
    myTable.dataSource = self; 
    myTable.delegate = self; 

सेल सेटअप के लिए कोड:

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // This is a hack to make sure that a white line doesnt appear between the 
    // first and second rows in the table, which happens for reasons I dont understand 
    if (indexPath.row == 0) { 
    return 29; 
    } 

    return 30; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"satCell"]; 
    if (!cell) 
    { 
    cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"satCell"]; 
    } 

    cell.backgroundView = nil; 
    cell.backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; 

    cell.backgroundColor = [UIColor whiteColor]; 
    int numberOfRowsInThisSection = [self tableView:tableView numberOfRowsInSection:indexPath.section]; 

    if (numberOfRowsInThisSection == 1) 
    { 
    cell.backingImage = self.singleWhite; 
    } 
    else if (indexPath.row == 0) 
    { 
    cell.backingImage = self.topWhite; 
    } 
    else if (indexPath.row % 2 == 0) 
    { 
    // Even row 
    if (indexPath.row == numberOfRowsInThisSection - 1) 
    { 
     // Last row (even) 
     cell.backingImage = self.botWhite; 
    } 
    else 
    { 
     // Normal row (even) 
     cell.backingImage = self.midWhite; 
    } 
    } 
    else if (indexPath.row % 2 == 1) 
    { 
    // Odd row 
    if (indexPath.row == numberOfRowsInThisSection - 1) 
    { 
     // Last row (even) 
     cell.backingImage = self.botDark; 
    } 
    else 
    { 
     // Normal row (odd) 
     cell.backingImage = self.midDark; 
    } 
    } 

    // Setup cell text [REMOVED FOR BREVITY] 

    return cell; 
} 

MyTableViewCell भीतर समर्थन छवि स्थापित करने के लिए कोड:

- (void)setBackingImage:(UIImage *)backingImage 
{ 
    if (self.backingImage != backingImage) 
    { 
    _backingImage = nil; 
    _backingImage = backingImage; 
    self.backingView.image = backingImage; 
    } 
} 

self.backingView निम्न कोड का उपयोग करके स्थापित किया गया है:

[[UIImageView alloc] initWithFrame:CGRectMake(7, 0, 307, 30)]; 
+0

क्या हम कुछ कोड देख सकते हैं? क्या आपके पास ऊंचाई पर कुछ भी चल रहा है ForRowAtIndexPath :? –

+0

सेल दृश्य संबंधित कोड अच्छा होगा। सेल में किस दृश्य में आप विचार जोड़ रहे हैं, सेल स्वयं, सामग्री दृश्य या पृष्ठभूमि दृश्य? आप अपनी खुद की छवियों को जोड़ रहे हैं जिसमें सीमा है? मैंने कुछ परीक्षण किए और मुझे लगता है कि विभाजक शैली समूहबद्ध तालिकाओं के साथ काम नहीं करती है, वे हमेशा विभाजक को आकर्षित करते हैं। –

+0

मैंने उन सभी कोड को जोड़ा है जिन्हें मैं सोच सकता हूं जो तालिका संरचना को प्रभावित कर सकते हैं। यदि आवश्यक हो तो मुझे कुछ और जोड़ने में खुशी होगी ... पीएस। ऊंचाई में हैक ForRowAtIndexPath: मेरा वर्तमान कामकाज है। यदि हैक हटा दिया गया है, तो अंतर – sleeke

उत्तर

3

यह एक ज्ञात मुद्दा है, केवल तभी होता है जब आप समूहबद्ध तालिका दृश्य के विभाजक छिपाते हैं, वही बात इस अन्य stack overflow question में हुई।

सीधे शब्दों में कहें, शीर्ष और निचले कोशिकाओं एक अतिरिक्त बिंदु उपयोग करें, लेकिन विभाजक गुप्त रखता है, तो समाधान है:

  1. घटाएँ अतिरिक्त स्थान (आप पहले से ही किया था)
  2. मेक पृष्ठभूमि एक दोहराव पैटर्न या एक खिंचाव छवि (खुद को बढ़ावा देने की कोशिश नहीं कर रहा है, लेकिन पिछले लिंक किए गए धागे पर the answer I gave यह भी बताता है कि खिंचाव छवियों को कैसे करें)।
  3. विभाजक को छिपाएं नहीं, लेकिन मिलान कोशिकाओं की पृष्ठभूमि के साथ रंग है, इसलिए यह इसके छिपे हुए दिखता है।

विकल्प 2 "स्वच्छतम" प्रतीत होता है और तालिका दृश्य कोशिकाओं के चरणीय ऊंचाइयों का समर्थन करने का लाभ जोड़ता है।

और यह अतिरिक्त बिंदु क्यों है? केवल ऐप्पल जानता है।

+0

तीन अच्छे समाधान, जिनमें से # 1 मेरी आवश्यकताओं को सर्वोत्तम रूप से मेल खाता है। मैं उस अतिरिक्त बिंदु को फिट करने के लिए अपनी पृष्ठभूमि को खींचने के बजाय, सभी पंक्तियों को एक ही ऊंचाई के बजाय रखना चाहता हूं। यहां यह ध्यान देने योग्य भी है कि मैंने नीचे की पंक्ति को एक ही व्यवहार को प्रदर्शित नहीं किया है - यह पंक्ति हमेशा बाकी की तरह 30 अंक लगती है। ऐसी गंदे विधि का सहारा लेना शर्म की बात है, लेकिन जैसा कि आप कहते हैं - ऐप्पल केवल जानता है कि ऐसा क्यों किया गया है ... – sleeke

0

यह मुझे अनुभाग हेडर चिल्ला रहा है। क्या आप viewForHeaderInSection विधि को ओवरराइड कर रहे हैं? मेरा सबसे अच्छा अनुमान यह है कि प्रत्येक खंड में आपके पहले सेल के लिए सीमाएं किसी भी तरह से उस अनुभाग के शीर्षलेख के लिए सीमाओं के साथ eliding है।

इन तरीकों अधिरोहण करने का प्रयास:

– tableView:viewForHeaderInSection: 
– tableView:viewForFooterInSection: 
– tableView:heightForHeaderInSection: 
– tableView:heightForFooterInSection: 
– tableView:willDisplayHeaderView:forSection: 
– tableView:willDisplayFooterView:forSection: 

और वे क्या लौटने के साथ खेलते हैं। विशेष रूप से heightForHeaderInSection/viewForHeaderInSection/willDisplayHeaderView: ForSection:

+0

मैंने उन तरीकों को ओवरराइड करने का प्रयास किया है, लेकिन ऐसा कोई प्रभाव नहीं प्रतीत होता है। कैन और जियोफ के उत्तर से ऊपर, ऐसा लगता है कि यह एक ज्ञात मुद्दा है और इन प्रतिनिधि विधि के रिटर्न के कारण नहीं ... – sleeke

1

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

मुझे लगता है कि यह सीमा रेखाचित्र के लिए जगह प्रदान करना है और आपके जैसे, मैंने प्रभाव को रद्द करने के लिए पहले और अंतिम कोशिकाओं की ऊंचाई के लिए वापस लौटाए गए मान को समायोजित किया है। दृश्य उपस्थिति बदल गई है क्योंकि यह आईओएस 7 में अच्छी तरह से बदल सकता है।

[संपादित करें] दृश्य पदानुक्रमों का निरीक्षण करने के लिए यह डीबग कोड का एक अच्छा सा है। आप निम्नलिखित हैं तो यह आपकी समस्या को ठीक कर देंगे (आप recursiveDescription सीधे कॉल कर सकते हैं नहीं क्योंकि यह निजी है और अपने कोड डिफ़ॉल्ट Xcode सेटिंग के तहत संकलित नहीं होंगे।)

NSLog(@"%@", [self.view performSelector:@selector(recursiveDescription)]);

+0

क्या आप एक बिंदु और पिक्सेल के बीच उल्लेख किए गए अंतर को स्पष्ट कर सकते हैं? क्या आपका मतलब है कि एक बिंदु सार्वभौमिक प्रतिनिधित्व है और रेटिना डिस्प्ले पर 2 पिक्सेल के रूप में दिखाता है? – sleeke

+0

हां, यही मेरा मतलब है। आप अपने रेटिना डिस्प्ले को देखकर पिक्सेल माप रहे थे। अतिरिक्त रिक्ति के लिए समायोजित करने के लिए आपको तालिका दृश्य का उपयोग करने की आवश्यकता है: heightForRowAtIndexPath: लेकिन समायोजन को अंक के रूप में, पिक्सेल नहीं प्रदान करें। –

1

: से छुटकारा 'बैकिंग इमेज' (बैकिंग व्यू)। सेल की backgroundView संपत्ति का उपयोग करने के लिए, बस उस पर UIImageView असाइन करें। अब जब आप बनाने अपनी पृष्ठभूमि के लिए UIImageView सुनिश्चित करें कि आप इस तरह UIImage खींचे बनाने बनाने:

UIImage *bg = [UIImage imageName:@"filename.png"]; 
bg = [bg resizableImageWithCapInsets:UIEdgeInsetsMake(15, 0, 15, 0)]; 

नोट: मैं अपनी छवि को 30 अंक की ऊंचाई है यह सोचते हैं रहा हूँ। जिस छवि का आप उपयोग कर रहे हैं उसे देखकर इसे लंबवत रूप से बढ़ाया जा सकता है, मैं इस उदाहरण में क्या कर रहा हूं। अधिक मेमोरी को बचाने के लिए आप इसे क्षैतिज रूप से भी खींच सकते हैं, लेकिन आपके पास जो संपत्ति है वह उसके लिए खुद को उधार नहीं दे सकती है।

आशा है कि इससे मदद मिलती है!

+0

यह एक अच्छा जवाब है, लेकिन दुर्भाग्य से नहीं कि मैं क्या कर रहा हूं। हालांकि यह अंतराल को कवर करेगा, फिर भी मैं शीर्ष पंक्तियों के साथ अन्य पंक्तियों की तुलना में 1 बिंदु बड़ा हो गया हूं ... – sleeke

0

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

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 1)]; 
    view.backgroundColor = [UIColor whiteColor]; 
    view.opaque = YES; 
    view.clipsToBounds = NO; 

    //Spill a view out by one pixel. 
    UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 2)]; 
    subView.backgroundColor = [UIColor whiteColor]; 
    subView.opaque = YES; 
    [view addSubview:subView]; 
    return view; 
} 

- (CGFloat)tableView:(UITableView *)tableView 
heightForHeaderInSection:(NSInteger)section { 
    return 1; 
} 
संबंधित मुद्दे