objective c - কিভাবে শিরোনাম পরিবর্তন অবাঞ্ছিত UIButton অ্যানিমেশন বন্ধ?




objective-c swift (15)

UITabBarController এর মধ্যে কন্ট্রোল কন্ট্রোলারগুলিতে বাটন শিরোনামগুলি পরিবর্তন করার সময় আমি কুৎসিত অ্যানিমেশন সমস্যাটি পেয়েছি। স্টোরিবোর্ডে মূলত সেট করা শিরোনামগুলি তাদের নতুন মানের মধ্যে ফেইড করার আগে অল্প সময়ের জন্য দেখিয়েছিল।

আমি সব সাবউইউউর মাধ্যমে পুনরাবৃত্তি করতে চাই এবং কীভাবে স্থানীয়ভাবে মানগুলি NSLocalizedString সহ পেতে বোতাম শিরোনামগুলি ব্যবহার করতে চাই;

for(UIView *v in view.subviews) {

    if ([v isKindOfClass:[UIButton class]]) {
        UIButton *btn = (UIButton*)v;
        NSString *newTitle = NSLocalizedString(btn.titleLabel.text, nil);
        [btn setTitle:newTitle];
    }

}

আমি খুঁজে পেয়েছি যে অ্যানিমেশন ট্রিগার কি সত্যিই btn.titleLabel.text কল। তাই এখনও স্টোরিবোর্ডগুলি ব্যবহার করতে এবং এই ধরনের উপাদানগুলিকে গতিশীলভাবে স্থানীয়করণ করাতে আমি প্রতিটি বোতামের পুনরুদ্ধার আইডি (আইডেন্টিটি ইনস্পেক্টারে) শিরোনামের মতো একই সেট করতে এবং শিরোনামের পরিবর্তে কী হিসাবে ব্যবহার করতে নিশ্চিত করি;

for(UIView *v in view.subviews) {

    if ([v isKindOfClass:[UIButton class]]) {
        UIButton *btn = (UIButton*)v;
        NSString *newTitle = NSLocalizedString(btn.restorationIdentifier, nil);
        [btn setTitle:newTitle];
    }

}

আদর্শ নয়, কাজ করে ..

আইওএস 7-এ আমার UIButton শিরোনাম ভুল সময়ের মধ্যে এবং বাইরে অ্যানিমেশন হয় - দেরী। এই সমস্যাটি iOS 6 এ উপস্থিত হয় না। আমি শুধু ব্যবহার করছি:

[self setTitle:text forState:UIControlStateNormal];

আমি এই অবিলম্বে এবং একটি ফাঁকা ফ্রেম ছাড়া ঘটতে পছন্দ করবে। এই ব্লিঙ্ক বিশেষত বিভ্রান্তিকর এবং অন্যান্য অ্যানিমেশন থেকে মনোযোগ আকর্ষণ করে।


Xhacker লিউ এক্সটেনশান সুইফ্ট রূপান্তর 3:

extension UIButton {
    func setTitleWithoutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, for: .normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}

আইওএস থেকে শুরু হচ্ছে 7.1 আমার জন্য কাজ করা একমাত্র সমাধান টাইপ UIButtonTypeCustom টাইপ দিয়ে শুরু করা UIButtonTypeCustom


আপনি কেবল কাস্টম বাটন তৈরি করতে পারেন এবং শিরোনাম পরিবর্তন করার সময় এটি অ্যানিমেশন বন্ধ করবে।

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"the title" forState:UIControlStateNormal];

আপনি স্টোরিবোর্ড চেকবক্সেও এটি করতে পারেন: স্টোরিবোর্ডে বোতামটি নির্বাচন করুন -> বৈশিষ্ট্যের পরিদর্শক (বাম দিক থেকে চতুর্থ) নির্বাচন করুন -> 'টাইপ' ড্রপ ডাউন মেনুতে, 'সিস্টেম' এর পরিবর্তে 'কাস্টম' নির্বাচন করুন যা সম্ভবত নির্বাচিত হয়েছিল ।

গুড লাক!


আপনি শিরোনাম লেবেলের স্তর থেকে অ্যানিমেশনগুলি সরাতে পারেন:

    [[[theButton titleLabel] layer] removeAllAnimations];

আমি উত্তর সমন্বয় সঙ্গে কাজ এটি পেয়েছিলাম:

[[[button titleLabel] layer] removeAllAnimations];

    [UIView performWithoutAnimation:^{

        [button setTitle:@"Title" forState:UIControlStateNormal];

    }];

আমি এটি করার জন্য একটি সুইফ্ট এক্সটেনশান তৈরি করেছি:

extension UIButton {
    func setTitleWithoutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, forState: .Normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}

UIButtonTypeSystem সাথে iOS 8 এবং 9 এ আমার জন্য কাজ করে।

(কোডটি সুইফ্ট 2, সুইফ্ট 3 এবং উদ্দেশ্য-সি এর জন্য হওয়া উচিত)


এই কাস্টম বোতাম জন্য কাজ করে:

[UIView setAnimationsEnabled:NO];
[_button setTitle:@"title" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

সিস্টেম বোতামগুলির জন্য আপনাকে অ্যানিমেশন পুনরায় সক্ষম করার আগে এটি যোগ করতে হবে (আপনাকে ধন্যবাদ @ ক্লেস):

[_button layoutIfNeeded];

কাস্টম হিসাবে UIButton টাইপ সেট করুন। যে অ্যানিমেশন বিবর্ণ এবং আউট মুছে ফেলা উচিত।


তাই আমি কাজ সমাধান খুঁজে পেতে:

_logoutButton.titleLabel.text = NSLocalizedString(@"Logout",);
[_logoutButton setTitle:_logoutButton.titleLabel.text forState:UIControlStateNormal];

প্রথম আমরা বাটন জন্য শিরোনাম পরিবর্তন, তারপর এই শিরোনাম জন্য বাটন পরিবর্তন


সঞ্চালন ব্যবহার performWithoutAnimation: পদ্ধতি এবং তারপর লেআউট পরে পরিবর্তে অবিলম্বে ঘটতে বাধ্য।

[UIView performWithoutAnimation:^{
  [self.myButton setTitle:text forState:UIControlStateNormal];
  [self.myButton layoutIfNeeded];
}];

সাধারনত সহজেই বাটন টাইপটি আমার জন্য কাস্টম কাজগুলিতে সেটিং করে, তবে অন্যান্য কারণে আমাকে UIButton সাব্লকাস করতে হবে এবং বোতামের টাইপটি ডিফল্ট (সিস্টেম) এ সেট করতে হবে, তাই ব্লিঙ্কিং পুনরায় আবির্ভূত হয়।

শিরোনামটি পরিবর্তন করার আগে UIView.setAnimationsEnabled(false) সেট করা এবং তারপরে আবার সত্যের পরে এটি আমার জন্য self.layoutIfNeeded() এড়াতে পারেনি, যদিও আমি self.layoutIfNeeded() বলি।

এই, এবং শুধুমাত্র নিম্নলিখিত সঠিক আদেশে, আমার জন্য iOS 9 এবং 10 বিটা দিয়ে কাজ করেছে:

1) UIButton জন্য একটি সাবক্লাস তৈরি করুন (স্টোরিবোর্ডে বোতামের জন্য কাস্টম ক্লাস সেট করতে ভুলবেন না)।

2) setTitle:forState: নিম্নরূপ:

override func setTitle(title: String?, forState state: UIControlState) {

    UIView.performWithoutAnimation({

        super.setTitle(title, forState: state)

        self.layoutIfNeeded()
    })
}

ইন্টারফেস বিল্ডারে, আপনি বাটন টাইপটি সিস্টেমে ছেড়ে যেতে পারেন, এই পদ্ধতির জন্য কাস্টম প্রকারে এটি পরিবর্তন করার প্রয়োজন নেই।

আমি আশা করি এটি অন্য কাউকে সাহায্য করবে, আমি বিরক্তিকর ব্লিঙ্কিং বোতামগুলি দিয়ে এতদিন ধরে সংগ্রাম করেছি যে আমি অন্যদের কাছে এড়াতে আশা করি;)


সুইফ্টে আপনি ব্যবহার করতে পারেন:

UIView.performWithoutAnimation {
    self.someButtonButton.setTitle(newTitle, forState: .normal)
    self.someButtonButton.layoutIfNeeded()
}

UIButtonTypeSystem এর জন্য কার্যকারিতার নিম্নলিখিত মহান উত্তর ফলাফলগুলির সাথে মিলিত :

if (_button.enabled)
{
    [UIView setAnimationsEnabled:NO];
    [_button setTitle:@"title" forState:UIControlStateNormal];
    [UIView setAnimationsEnabled:YES];
}
else // disabled
{
    [UIView setAnimationsEnabled:NO];
    _button.enabled = YES;
    [_button setTitle:@"title" forState:UIControlStateNormal];
    _button.enabled = NO;
    [UIView setAnimationsEnabled:YES];
}

দয়া করে নোট করুন:

_button এর " বোতাম টাইপ " যখন " UIButtonTypeSystem " হয়, নীচের কোডটি অবৈধ :

[UIView setAnimationsEnabled:NO];
[_button setTitle:@"title" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

_button এর " বোতাম টাইপ " যখন " UIButtonTypeCustom " হয়, উপরের কোড বৈধ





uikit