2012-11-29 7 views
6

जब मैं बटन दबाता हूं और चौड़ाई को एनिमेट करता हूं तो मैं अपनी UIButton को एक नई पृष्ठभूमि छवि देने की कोशिश कर रहा हूं। समस्या यह है कि बटन छवि को स्केल नहीं करता है (मैं केवल रेटिना छवियों का उपयोग कर रहा हूं)।पृष्ठभूमि UIUutton स्केल पर छवि गलत तरीके से

क्लिक करने से पहले:

enter image description here

क्लिक करने के बाद:

enter image description here

और कोड है कि चीजें बनाता होती हैं:

UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)]; 
     [self.profileButton setBackgroundImage:buttonProfileDefault forState:UIControlStateNormal]; 

[self.profileButton removeConstraint:self.profileButtonConstraint]; 

// Animate 
CGRect originalFrame = self.profileButton.frame; 
originalFrame.size.width = 40; 
[UIView animateWithDuration:0.2f 
    animations:^{ 
     self.profileButton.frame = originalFrame; 
    } 
     completion:^(BOOL finished) { 
    }]; 
+0

मुझे आशा है कि हम यह पता लगा सकते हैं: मैं एक ही समस्या है। मैंने सभी सामग्री की कोशिश की है मोड विकल्प और सभी छविइजइजनेट्स (जिनके लिए मैंने अपनी पृष्ठभूमि छवि को बटन की छवि में ले जाया है, जो बटन शीर्षक को कवर या हटा देता है) सभी को कोई फायदा नहीं हुआ। – tobinjim

+0

मैं इस पर एक उपहार दूंगा। वास्तव में इसे जानने की जरूरत है। –

+0

@ HolgerEdwardWardlowSindbæk मेरे कोड को आजमाएं ... –

उत्तर

1

मैं इस एक ही समस्या थी, लेकिन ऐसा हुआ जब मेरे एप्लिकेशन को लोड, मैं निरीक्षक में button की विशेषताओं के साथ चारों ओर गड़बड़ है और यह काम हो सकता है अगर आप नीचे स्क्रॉल करें और अन-चेक करें autoresize subviews, यह मेरे लिए किया था ! शुभ लाभ!

+0

मुझे उम्मीद थी कि यह मेरे लिए एक ही समस्या को ठीक करेगा, लेकिन ऐसा नहीं हुआ। मेरी पृष्ठभूमि छवि UIImageView के उप-वर्ग द्वारा ली गई है, हालांकि, इस तरह: [self setBackgroundImage: [backgroundImageView image] forState: UIControlStateNormal]; – tobinjim

+0

@tobinjim क्या आपने अपनी स्टाइल विशेषता को सादा से कस्टम में बदलने का प्रयास किया? – Shinigamae

+0

@ शिनिगामा मुझे लगता है कि मेरा हमेशा कस्टम था। मैंने अंततः UIButton के उप-वर्ग का उपयोग करने की धारणा को हटा दिया और एक स्पर्श को संभालने वाले UIView उपclass में गया।मैं मूल रूप से UIButton वर्ग की तरह हूं क्योंकि नियंत्रण स्थिति के साथ शीर्षक टेक्स्ट ट्रैक; लेकिन जब मैंने अपने कार्यक्रम का परीक्षण किया तो यह कष्टप्रद हो गया कि शीर्षक परिवर्तन इतना अचानक था, इसलिए मेरे UIView सबक्लास में मैं एक ही संदेश को संभालता हूं लेकिन एक त्वरित फीका और बदलते पाठ में संक्रमण करता हूं। – tobinjim

2

जिस तरह से आप एज इंसेट बना रहे हैं, वह बाएं 3 और सही 3 पिन (या पिक्सेल) स्थिर रखेगा, और यह बटन पर सिर को फैलाएगा। यदि आप सिर के आकार को स्थिर रखना चाहते हैं, तो आपको इसे बाईं तरफ शामिल करना होगा, 1 पिक्सेल खिंचाव छोड़ दें और फिर दाईं ओर आ जाए। अपनी तस्वीर की चौड़ाई मान लिया जाये कि 50 है, तो आप लिखते थे:

UIImage * buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 46, 3, 3)];

बहरहाल, यह अपनी तस्वीर बटन के बाईं ओर में तैनात होगा। समाधान मेरा सुझाव है 2 छवियों का उपयोग करने होगा:

  1. एक आकार बदलने योग्य छवि ही बटन की सीमा, बटन की पृष्ठभूमि छवि के रूप में सेट युक्त
  2. एक छवि केवल सिर से युक्त, साथ बटन छवि के रूप में स्थापित लगातार आकार

कोड कुछ ऐसा दिखाई देगा:

UIImage *backgroundImage = [[UIImage imageNamed:@"border.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)]; // in this case you can use 3, 3, 3, 3

[self.profileButton setBackgroundImage:backgroundImage forState:UIControlStateNormal];

UIImage *titleImage = [UIImage imageNamed:@"head.png"];

[self.profileButton setImage:titleImage forState:UIControlStateNormal];

आशा इस मदद करता है!

+0

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

+0

आपकी छवि का मूल आकार क्या है? – Levi

+0

70 x 58 (मैं केवल रेटिना और गैर-रेटिना आईफ़ोन दोनों के लिए रेटिना संस्करण का उपयोग करता हूं) –

1

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

उम्मीद है कि आपके मुद्दों को हल करता है।

-Brandon

+0

इससे शायद समस्या ठीक हो जाएगी, लेकिन मैं ऑटो लेआउट का उपयोग करना चाहता हूं। और यदि आप इसे अनचेक करते हैं, तो यह पूरे ऐप के लिए है! –

+0

ऑटोलाउट चयन केवल उस निब पर लागू होते हैं जहां आप इसे चेक या अनचेक करते हैं। आपके पास ऑटोलायआउट का उपयोग करके कुछ निब्स हो सकते हैं, और कुछ उसी ऐप में ऑटोलायआउट का उपयोग नहीं कर रहे हैं –

2

मैं निम्नलिखित बातों पर अपने कोड को संशोधित किया है: छवि Profile_Button_Default.png (या की

  • प्रदान की पूरा नाम।जेपीजी आदि), सामान्य के मामले में के रूप में छवि के लिए
  • जोड़ा राज्यों यह इन प्रभावों बटन की शुरुआत में प्रकाशित नहीं किया जाएगा

छुआ अब जाँच करें:

UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)]; 
[self.profileButton setBackgroundImage:buttonProfileDefault forState:UIControlStateNormal]; 
[self.profileButton setBackgroundImage:buttonProfileDefault 
           forState:UIControlStateSelected]; 
[self.profileButton setBackgroundImage:buttonProfileDefault forState:UIControlStateHighlighted]; 

[self.profileButton removeConstraint:self.profileButtonConstraint]; 

// Animate 
CGRect originalFrame = self.profileButton.frame; 
originalFrame.size.width = 40; 
[UIView animateWithDuration:0.2f 
       animations:^{ 
        self.profileButton.frame = originalFrame; 
       } 
       completion:^(BOOL finished) { 
       }]; 
1

आप एक प्रति नहीं कर सका छवि का और इसे सही बटन आकार में आकार दें? इस post.

में

बाहर चेक IWasRobbed "s जवाब वह आप के लिए वहाँ एक अच्छा कार्य है और उसके बटन के लिए इस विधि का उपयोग करने के लिए दावा करता है।

+0

बटन छवियों के लिए उपयोग करना उचित हो सकता है, लेकिन मैंने पाया कि इन विधियों ने बड़ी छवियों के लिए वांछित की तुलना में बहुत अधिक मेमोरी का उपयोग किया था। यह गतिविधि मॉनिटर उपकरण में एक विशाल स्पाइक दिखाएगा, और मुझे बहुत सारी स्मृति चेतावनियां मिल रही हैं। – AlleyGator

2

मुझे लगता है कि समस्या यह है कि अपनी पृष्ठभूमि बदल रहा है और है तो उसका आकार बदलें।

कुंजी एक एनीमेशन में ऑटो लेआउट के साथ काम कर रहा है widthConstraint निरंतर मूल्य चेतन करने के लिए और यह भी सेट पृष्ठभूमि छवि इसे प्राप्त करने के लिए।

उदाहरण के लिए, मैं एक butto है

UIImage *imageButton = [[UIImage imageNamed:@"button"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)]; 

[UIView animateWithDuration:0.01f 
       animations:^{ 
        [self.button setBackgroundImage:imageButton forState:UIControlStateNormal]; 
       } 
       completion:^(BOOL finished) { 
        [UIView animateWithDuration:1.0f 
             animations:^{ 
              self.buttonWidth.constant = 300; 
              [self.view layoutIfNeeded]; 
             } 
             completion:^(BOOL finished) { 
             }]; 


       }]; 

आप ऊपर मेरे कोड, कुंजी के साथ देख सकते हैं: - एन मेरे विचार नाम बटन पर, मैं अपने चौड़ाई buttonWidth नामित बाधा के लिए एक IBOutlet है नीचे मेरी buttonPress के लिए कोड है यह मेरे लिए काम करने के लिए एनीमेशन के अंदर बटन पृष्ठभूमि सेट कर रहा था, किसी कारण से अगर मैंने एनीमेशन के बाहर पृष्ठभूमि छवि बदल दी है तो यह एनीमेशन पूर्ण होने तक इसे सही तरीके से सेट नहीं करेगा।

भी फ्रेम की स्थापना का उपयोग करते समय autolayout मेरे लिए काम नहीं किया है, इसलिए मैं बाधा निरंतर

2

इस प्रयास करें एनिमेटेड, बजाय के रूप में

UIImage *buttonProfileDefault = [[UIImage imageNamed:@"Profile_Button_Default"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 3)]; 

छवि बताए इस

UIImage *buttonProfileDefault = [UIImage imageNamed:@"Profile_Button_Default"]; 
करना

resizableImageWithCapInsets की बाधा स्थापित करने की कोई आवश्यकता नहीं है।

3

इस कोड की कोशिश ...

[UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:1.0]; 
    [self.profileButton setBackgroundImage:[UIImage imageNamed:@"Profile_Button_Default"] forState:UIControlStateNormal]; 
    [self.profileButton setBackgroundImage:[UIImage imageNamed:@"Profile_Button_Default"] forState:UIControlStateSelected]; 
    [self.profileButton setFrame:CGRectMake(self.profileButton.frame.origin.x, self.profileButton.frame.origin.y, self.profileButton.frame.size.width + 40, self.profileButton.frame.size.height)]; 
    [UIView commitAnimations]; 

मैं इस मदद आशा है कि आप ...

+0

अगर आपको किसी भी समस्या का सामना करना पड़ेगा तो टिप्पणी को छोड़कर छोड़ दें .. –

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