Başlık güncellenirken UIButton'un yanıp sönmesi nasıl engellenir


85

Bir UIButton'da setTitle'ı çağırdığımda, iOS 7'de düğme yanıp sönüyor. MyButton.highlighted = NO ayarını denedim, ancak bu, düğmenin yanıp sönmesini durdurmadı.

[myButton setTitle:[[NSUserDefaults standardUserDefaults] stringForKey:@"elapsedLabelKey"] forState:UIControlStateNormal];

myButton.highlighted = NO;

Başlıkları güncelleyen zamanlayıcıyı şu şekilde ayarladım:

- (void)actionTimer {
    if (myTimer == nil) {

        myTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0
                        target: self
                        selector: @selector(showActivity)
                        userInfo: nil
                        repeats: YES];
    }
}

İşte başlıkları gerçekten güncelleyen yöntem:

- (void)showActivity {

    NSString *sym = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];

    if (pauseInterval == nil) {

        // Update clock
        seconds = [[NSDate date] timeIntervalSinceDate:startInterval] - breakTime;

        // Update total earned
        secRate = rate.value / 60 / 60;
        total = secRate * seconds;
        [totalLabel setTitle:[NSString stringWithFormat:@"%@%.4f",sym,total] forState:UIControlStateNormal];

        days = seconds / (60 * 60 * 24);
        seconds -= days * (60 * 60 * 24);
        int hours = seconds / (60 * 60);
        fhours = (float)seconds / (60.0 * 60.0);
        seconds -= hours * (60 * 60);
        int minutes = seconds / 60;
        seconds -= minutes * 60;

        // Update the timer clock
        [elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
    }
}

Yanıp sönmemeli. Bunu arka plan iş parçacığında mı yapmaya çalışıyorsunuz?
BergQuester

Evet, düğme başlığını her saniye güncellemek için bir zamanlayıcıda ayarlanıyor (ki kendi iş parçacığını oluşturduğunu düşünüyorum)
FierceMonkey

Zamanlayıcılar, yalnızca bunları yapacak şekilde ayarlarsanız ayrı bir iş parçacığı üzerinde çalışır. Başlığın güncellendiği yöntemi ve zamanlayıcıyı nasıl kurduğunuzu görebilir miyiz?
BergQuester

İstenen kodu ana soruya
ekledim

Yanıtlar:


208

Düğme türünü UIButtonTypeCustom olarak ayarlayın, yanıp sönmeyi durdurur


16
Bu gerçekten tercih edilen cevap olmalı. En basit çözüm. Ve çalışıyor.
Johan Karlsson

4
Kabul. Pek çok başka çözüm denedim ve bunu tek başına yapan şey buydu.
Barbekü Steve

2
Kabul edilen cevap bu olmalıdır. Şimdiye kadarki en basit çözüm.
Machado

1
Tıkır tıkır çalışıyor! Teşekkürler

2
Bunun için herhangi bir kod yazmadan gerçekten iyi bir çözüm olduğunu düşünüyorum.
Chauyan

58

[UIView setAnimationsEnabled:NO]Diğer animasyonları etkilemekten daha iyi bir yaklaşım , yalnızca belirli başlık animasyonunu devre dışı bırakmaktır.

Amaç-C:

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

Swift:

UIView.performWithoutAnimation { 
    myButton.setTitle(text, for: .normal)
    myButton.layoutIfNeeded()
}

Az önce en son iOS'ta Swift çözümünü denedim - harika çalışıyor.
Ronen Rabinovici

1
Gün kurtarıcısı. Şerefe!
pkc456

Bunu sadece Swift 3'te denedim ve layoutIfNeeded () kullanmadan çalışıyor
user1898712

3
Bu şüphesiz kabul edilen cevap olmalıdır!
Julius

1
Bunu yapmanın en iyi yolu budur. Mükemmel cevap!
aecend

29

* Lütfen aklınızda bulundurun *

_button " buttonType " "UIButtonTypeSystem" olduğunda , aşağıdaki kod geçersizdir

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

_button " buttonType " "UIButtonTypeCustom" olduğunda , yukarıdaki kod geçerlidir .


19

Başlık değişikliğinde istenmeyen UIButton animasyonu nasıl durdurulur? Bölümündeki yanıtlara bakın. :

[UIView setAnimationsEnabled:NO];
[elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

7
Bir çağrı eklemeyi deneyin @FierceMonkey layoutIfNeeded: [elapsed layoutIfNeeded];. Bu, benim durumumda yanıp sönmeyi ortadan kaldırdı.
Klaas

1
layoutIfNeeded benim için yaptı.
Kaolin Yangını

Oldukça kirli bir çözüm gibi görünüyor, ancak layoutIfNeededişe yarıyor gibi görünüyor
Przemysław Wrzesiński

7

İleride kolay kullanım için UIButton için başka bir işlev yapabilirsiniz.

extension UIButton {
    func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
        UIView.performWithoutAnimation {
            self.setTitle(title, for: controlState)
            self.layoutIfNeeded()
        }
    }
}

İşte bu!

Başlığı daha önce yaptığınız gibi ayarlayın, ancak setTitleşununla değiştirin:setTitleWithoutAnimation


6

Varsayılan "setTitle" davranışı kesinlikle nefret dolu!

Benim çözümüm:

[UIView setAnimationsEnabled:NO];
[_button layoutIfNeeded]; 
[_button setTitle:[NSString stringWithFormat:@"what" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

Ayrıca, film şeridinde, düğme özelliği altında işaretini kaldırıyorum:

  • Vurgulandığında Tersine Çevirir
  • Vurgulanan Görüntüyü Ayarla

Ve kontrol edin:

  • Devre Dışı Görüntüyü Ayarla

İOS 8'de de test edildi ve çalışıyor .

Güncelleme - Swift

Size özel düğmenizi oluşturmanızı ve setTitle yöntemini geçersiz kılmanızı öneririm .

class UnflashingButton: UIButton {
   
    override func setTitle(title: String?, forState state: UIControlState) {
        UIView.setAnimationsEnabled(false)
        self.layoutIfNeeded()
        super.setTitle(title, forState: state)
        UIView.setAnimationsEnabled(true)
    }

}

Bu yaklaşımı denedim (alt sınıflandırma, setTitle: forState: geçersiz kılma ve UIView.setAnimationsEnabled'ı devre dışı bırakma-etkinleştirme). İOS 9 ve 10 beta sürümlerinde benim için çalışmıyor. Yalnızca animasyonları devre dışı bırakırsam, ancak daha sonra her UIView için kaybolurlarsa çalışır ...
cdf1982

2

Bunu deneyin, bu daha yeni IOS sürümlerinde çalışır:

class CustomButtonWithNoEffect : UIButton {
    override func setTitle(_ title: String?, for state: UIControlState) {
        UIView.performWithoutAnimation {
            super.setTitle(title, for: state)
            super.layoutIfNeeded()
        }
    }

}

0

Kodlama ve Stackoverflow konusunda yeniyim, bu nedenle https://stackoverflow.com/users/4673064/daniel-tseng mükemmel yanıtı genişletmek için doğrudan yorum yapacak kadar itibarım yok . Bu yüzden kendi yeni cevabımı yazmalıyım ve bu şu:

extension UIButton {
    func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
        UIView.performWithoutAnimation {
            self.setTitle(title, for: controlState)
            self.layoutIfNeeded()
        }
    }
}

Şunlar DIŞINDA harika çalışıyor:

Daha sonra "setTitleWithoutAnimation" kodundaki tüm çağrılarım bir gönderen belirtmiyorsa, CoreMedia veya CoreData ile ilgili bu garip mesajları alıyorum, örneğin, "2526'dan CoreMedia izinleri devralınamadı: (null)"

Bu muhtemelen kodlama ve iOS için oldukça basit, ancak benim için yeni bir kodlayıcı olarak beni bir süreliğine bir tavşan izine gönderdi: Bugün Uzantısı CoreMedia izinlerini devralamadı , burada insanların ilginç cevapları vardı ama bu OLMADI sorunumun kökenine ulaşın.

Sonunda, içinden geçip parametresiz fonksiyon parametrelerimi vermem gerektiğini anladım, yani bir gönderici belirtmem gerekiyordu. Bu gönderen UIButton, Any veya AnyObject olabilir. Bunların hepsi işe yaradı, ancak sonuçta "self" ile bir düğme uzantısı eklemek ile daha sonra özellikle bir düğmenin onu kullandığını söylememek arasında bir çelişki var gibi görünüyor.

Yine, muhtemelen basit, ama benim için yeni, bu yüzden paylaşmaya değer olacağını düşündüm.


0

Başka bir numara

@IBOutlet private weak var button: UIButton! {
    didSet {
        button.setTitle(title, for: .normal)
    }
}

Bu, yalnızca API çağrısı yapmadan başlığın değerini biliyorsanız çalışır. Düğmenin başlığı, görünüm yüklenmeden önce ayarlanacak, böylece animasyonu görmeyeceksiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.