2009-08-09 12 views
5

मुझे UIImageView के साथ वास्तव में अजीब समस्या है। मेरे पास एक छवि (एक आरजीबी पीएनजी) 45x45 पिक्सेल है जो मैं दृश्य में जोड़ता हूं। मैं देख सकता हूं कि दृश्य में जोड़े जाने के बाद छवि धुंधली हो गई है। यहाँ सिम्युलेटर (बाएं) में एक ही छवि है और Xcode में (दाएं):मेरा UIImageView क्यों धुंधला हुआ है?

- (id) initWithImage:(UIImage*) image { 
    self = [super initWithImage:image]; 

    self.frame = CGRectMake(0, 0, 45, 45); 
    self.contentMode = UIViewContentModeScaleAspectFit; 

    self.quantity = 1; 
    if (self) { 
     self.label = [[UITextField alloc]initWithFrame:CGRectMake(0,40,45,25)]; 
     self.label.font = [UIFont systemFontOfSize:16]; 
     self.label.borderStyle = UITextBorderStyleNone; 
     self.label.enabled = TRUE; 
     self.label.userInteractionEnabled = TRUE; 
     self.label.delegate = self; 
     self.label.keyboardType = UIKeyboardTypeNumbersAndPunctuation; 
     self.label.textAlignment = UITextAlignmentCenter; 
    } 
    self.userInteractionEnabled = TRUE; 

    // Prepare 3 buttons: count up, count down, and delete 
    self.deleteButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    self.deleteButton.hidden = NO; 
    self.deleteButton.userInteractionEnabled = YES; 
    self.deleteButton.titleLabel.font = [UIFont systemFontOfSize:20]; 
    self.deleteButton.titleLabel.textColor = [UIColor redColor]; 
    [self.deleteButton setTitle:@"X" forState:UIControlStateNormal]; 
    [self.deleteButton addTarget:self action:@selector(deleteIcon:) forControlEvents:UIControlEventTouchUpInside]; 

    self.upCountButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    self.upCountButton.hidden = NO; 
    self.upCountButton.userInteractionEnabled = YES; 
    [self.upCountButton setTitle:@"+" forState:UIControlStateNormal]; 
    [self.upCountButton addTarget:self action:@selector(addQuantity:) forControlEvents:UIControlEventTouchUpInside]; 

    self.downCountButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    self.downCountButton.hidden = YES; 
    self.downCountButton.userInteractionEnabled = YES; 
    [self.downCountButton setTitle:@"-" forState:UIControlStateNormal]; 
    [self.downCountButton addTarget:self action:@selector(removeQuantity:) forControlEvents:UIControlEventTouchUpInside]; 
    return self; 
} 

मैं इस तरह इसे बनाने:

alt text http://partywithvika.com/iconinsim.pngalt text http://partywithvika.com/iconinxcode.png

मैं इस initWithImage कोड के साथ कस्टम UIImageView वर्ग है :

UIImage *desertIcon = [UIImage imageNamed:@"desert.png"]; 
IconObj *desertIconView = [[IconObj alloc] initWithImage:desertIcon]; 
desertIconView.center = CGPointMake(265,VERTICAL_POINT_ICON); 
desertIconView.type = [IconObj TYPE_DESERT]; 
[self.view addSubview:desertIconView]; 
[desertIconView release]; 

प्रदर्शित छवि फ़ाइल में संग्रहीत की तुलना में क्यों होगी?

+0

यह शायद असंबंधित समस्या है, लेकिन अपने init विधि है, बताए 'स्वयं = के बाद और अधिक परंपरागत होगा [सुपर initWithImage: छवि]', आप जांच चाहे स्वयं शून्य है, और यदि यह है, तुरंत वापस लौटें। यदि स्वयं कभी शून्य हो, तो यह इसलिए है क्योंकि (1) अभिभावक का प्रारंभिक स्वयं ठीक से प्रारंभ नहीं कर सका, या (2) आवंटित कुछ अजीब स्मृति स्थिति (अत्यंत दुर्लभ) की वजह से शून्य वापस आ गया। यह अच्छी रक्षात्मक प्रोग्रामिंग अभ्यास है। –

+0

नोट के लिए धन्यवाद, मैं इसे आजमाउंगा। –

उत्तर

0

स्क्रीन पिक्सल पर अपने IconObj व्यू को संरेखित करने का प्रयास करें। यदि यह वास्तव में 45x45 है तो आपको केंद्र को CGPointMake (x + 0.5f, y + 0.5f) जैसे कुछ सेट करना चाहिए।

आपको छवि आकार को पिक्सेल में भी दोहराया जाना चाहिए (उदाहरण के लिए preview.app कमांड -1 में)।

+0

निकोलाई, मुझे आपकी टिप्पणी में 'x' और 'y' का अर्थ नहीं मिला। दिलचस्प बात यह है कि यदि एक ही कोड के साथ बड़ी तस्वीर के साथ शुरू किया गया है तो UIImageView बहुत तेज़ है। –

+0

एक्स और वाई के साथ मेरा मतलब किसी भी पूर्णांक निर्देशांक है। जबकि फ्रेम, सीमाएं और केंद्र गुण सभी निर्देशांकों के लिए CGFloat आधारित प्रकारों का उपयोग करते हैं, आमतौर पर स्क्रीन पर विचारों को पिक्सेल-संरेखित करना एक अच्छा विचार है। –

1

क्या मैं कर रहा

contentMode = UIViewContentModeScaleAspectFit; 
+0

मैंने आपको छवि आकार को दोबारा जांचने के लिए कहा था। –

+0

निकोलाई, मेरी छवि 45x45 थी और UIImageView के लिए फ्रेम भी 45x45 था। आप इस सेटअप को गलत तरीके से समझने की क्षमता कहां देखते हैं? –

+1

क्या आपने छवि के पिक्सल को पिक्सेल स्क्रीन पर संरेखित करने का प्रयास किया था? –

3

साथ 45X45 UIImageView में बड़ी तस्वीर लोड कर रहा है जाहिर है, समाप्त हो गया है कि मैं इस समस्या थी और यह मेरे पागल गाड़ी चला रहा था। कुछ जांच के बाद यह पता चला कि मेरी छवि फ्रेम से छोटी थी, और इसलिए स्केलिंग ने इसे धुंधला कर दिया। एक बार जब मैंने उच्च रिजोल्यूशन छवियों में डाल दिया तो समस्या खत्म हो गई।

सुनिश्चित करें कि आपका छवि आकार आपके UIImageView फ्रेम आकार से बड़ा है।

8

सामान्य रूप से, जो कुछ भी आप आईफोन पर यूआईकेट के साथ करते हैं वह पिक्सेल-गठबंधन होना चाहिए। पिक्सेल संरेखण के साथ समस्या आमतौर पर अस्पष्टता के रूप में प्रकट होती है (यह विशेष रूप से टेक्स्ट और छवियों के साथ सच है)। यही कारण है कि जब मुझे धुंधला दृश्य मिलता है, तो मैं पहले जांच करता हूं कि क्या मैं center संपत्ति सेट कर रहा हूं। जब आप center सेट करते हैं, तो फ्रेम का एक्स, वाई, ऊंचाई और चौड़ाई उस केंद्र बिंदु के चारों ओर समायोजित होती है ... अक्सर परिणामी मानों में परिणाम होता है।

आप दिखाया गया है फ्रेम पर CGRectIntegral का उपयोग कर की कोशिश कर सकते:

desertIconView.center = CGPointMake(265,VERTICAL_POINT_ICON); 
desertIconView.frame = CGRectIntegral(desertIconView.frame); 

यह काम कर सकते हैं, लेकिन अगर ऐसा नहीं होता, यह सुनिश्चित करें कि कोई भी मान आंशिक हैं मैन्युअल frame की स्थापना, center संपत्ति का उपयोग किए बिना की कोशिश ।

संपादित करें: ओह! ध्यान नहीं दिया कि ओपी ने अपने स्वयं के प्रश्न का उत्तर दिया था ... मैं वैसे भी सूचनात्मक कारणों से इसे छोड़ दूंगा।

+1

अधिकांश अन्य उत्तरों (मूल पोस्टर के अलावा) यह पहचानते हैं कि यह एक पिक्सेल संरेखण समस्या है, हालांकि इसके लिए +1 यह सबसे स्वच्छ और सबसे सामान्य उद्देश्य है। उपाय – MrCranky

3

आपका आइकनऑब 45 पिक्सेल चौड़ा है। आप अपने IconObj केंद्र को 265 पर ले जाते हैं जो इसकी फ्रेम (242.5, VERTICAL_POINT_ICON - 25 * 0.5, 45, 25) बनाता है। फ्रेम पैरामीटर पूर्णांक नहीं है, तो छवि हमेशा धुंधला रहेगी।

समाधान, फ्रेम पैरामीटर की गणना करें (केंद्र का उपयोग न करें)। और हमेशा इसे पूर्णांक बनाएं (एनएसआईएनटेगर को कास्ट करें, छत, मंजिल या गोल का उपयोग करें)।

desertIconView.frame = CGRectMake((NSInteger)(265 - 45*0.5), 
            (NSInteger)(VERTICAL_POINT_ICON - 25*0.5), 
            45, 25); 
1

मुझे बस एक ही समस्या थी। सबसे पहले मैंने सोचा कि क्या मुझे चश्मा चाहिए?

तब मुझे एहसास हुआ कि जब आप इसे एक अजीब संख्या देते हैं तो छवि (या लेबल) को केन्द्रित करना संभव नहीं है। आपको अपनी छवि का आकार बदलने की आवश्यकता है उदा। 46 * 46 यदि आप इसे केन्द्रित करना चाहते हैं और तेज रहना चाहते हैं।

या आप इसे 45 * 45 पर छोड़ सकते हैं, लेकिन फिर आपको यह तय करने की आवश्यकता है कि क्या आप चाहते हैं कि आपकी छवि दाएं से 1 पिक्सेल या बाईं ओर 1 पिक्सेल हो। (या इसे धुंधला छोड़ दें)।

0

ऑफसेट समस्या के लिए पूरा स्रोत:

contentImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; 

    UIImage *cImage = [UIImage imageNamed:image]; 
    self.contentImage.image = cImage; 

    [self.contentImage setFrame:CGRectMake(0, 0, cImage.size.width, cImage.size.height)]; 

    CGFloat offset = 0.0f; 

    if (((int)cImage.size.width % 2) && ((int)cImage.size.height % 2)) { 
    offset = 0.5f; 
    } 

    [self.contentImage setCenter:CGPointMake(256.0f + offset, 256.0f + offset)];