İOS7'de şeffaf bir UIToolbar veya UINavigationBar nasıl çizilir


88

Tamamen şeffaf UIToolbarve / veya istiyorum UINavigationBar. İOS 5 öncesi ve sonrası için önerilen çeşitli büyüleri denedim, ancak hiçbiri artık işe yaramıyor.

Bu iOS 7'de nasıl başarılabilir?


Gelecek nesil için - Yanlışlıkla self.edgesForExtendedLayout = UIRectEdgeNone kullanıyordum, bu da görünümün araç çubuğunun altında genişlemesini engelliyordu.
Ben Packard

Yanıtlar:


303

Swift 3 (iOS 10)

Şeffaf UIToolbar

self.toolbar.setBackgroundImage(UIImage(),
                                forToolbarPosition: .any,
                                barMetrics: .default)
self.toolbar.setShadowImage(UIImage(), forToolbarPosition: .any)

Şeffaf UINavigationBar

self.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true

Hızlı <3

Şeffaf UIToolbar

self.toolbar.setBackgroundImage(UIImage(),
                                forToolbarPosition: UIBarPosition.Any,
                                barMetrics: UIBarMetrics.Default)
self.toolbar.setShadowImage(UIImage(),
                            forToolbarPosition: UIBarPosition.Any)

Şeffaf UINavigationBar

self.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: UIBarMetrics.Default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.translucent = true

Amaç-C

Şeffaf UIToolbar

[self.toolbar setBackgroundImage:[UIImage new]
              forToolbarPosition:UIBarPositionAny
                      barMetrics:UIBarMetricsDefault];
[self.toolbar setShadowImage:[UIImage new]
          forToolbarPosition:UIBarPositionAny];

Şeffaf UINavigationBar

[self.navigationBar setBackgroundImage:[UIImage new]
                         forBarMetrics:UIBarMetricsDefault];
self.navigationBar.shadowImage = [UIImage new];
self.navigationBar.translucent = YES;

Tartışma

Ayar translucentiçin YESgezinme çubuğunda nedeniyle tartışılan bir davranışa, hile yok UINavigationBarbelgelere. Burada ilgili parçayı bildireceğim:

Bu özelliği YESopak bir özel arka plan resmine sahip bir gezinme çubuğunda olarak ayarlarsanız , gezinme çubuğu resme 1,0'dan daha düşük bir sistem opaklığı uygular.


Son sonuç

son sonuç


1
Araç çubuğu sürümünün iOS7'de çalıştığını onayladınız mı? Karanlık bir araç çubuğu ve sunumda garip bir titreme görüyorum.
Ben Packard

2
Ekran görüntüsü iOS 7simülatörden alınmıştır
Gabriele Petronella

Ayrıca iPhone 5'imde iOS 7 ile bir test uygulaması çalıştırıyorum ve beklendiği gibi çalışıyor.
Gabriele Petronella

1
İyi iş çıkardın,
SO'da

2
EdgeForExtendedLayout = UIRectEdgeNone kullanıyorsanız, muhtemelen özel geçişler uygulamak isteyeceksiniz. Aksi takdirde, görünümleri iterken varsayılan geçiş, animasyon sırasında şeffaf çubuğun altında koyu bir titreme oluşturacaktır. Bilginize, işte temel bir kayan geçiş için hızlı bir kaynak: gist.github.com/ArtFeel/7690431
anna

8

Tüm uygulama üzerinden yapmak istiyorsanız, UIAppearance proxy (iOS5 +) kullanmalısınız:

UINavigationBar *navigationBarAppearance = [UINavigationBar appearance]; navigationBarAppearance.backgroundColor = [UIColor clearColor]; [navigationBarAppearance setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; navigationBarAppearance.shadowImage = [[UIImage alloc] init];

Dokümanlar: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIAppearance_Protocol/Reference/Reference.html

Makale: http://nshipster.com/uiappearance/


Sadece buna bakan kişiler için bir not - bunu uygulamanın hızlı ve kirli bir yolu için bu kodu AppDelegate didFinishLaunchingWithOptions uygulamanıza ekleyin.
Shaun F

Ayrıca, bu görünüm proxy'sini yalnızca belirli UINavigationControlleralt sınıflarla, yani bu davranışın uygulanmasını istediğiniz alt sınıflarla çalışacak şekilde ayarlayabilirsiniz .
Evan R

2

Deneyin:

[navBar setBackgroundImage:[UIImage alloc] forBarMetrics:UIBarMetricsDefault];

0
@implementation MyCustomNavigationBar

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self setup];
    }
    return self;
}

- (void)setup {
    [self setupBackground];
}

- (void)setupBackground {
    self.backgroundColor = [UIColor clearColor];
    self.tintColor = [UIColor clearColor];

    // make navigation bar overlap the content
    self.translucent = YES; 
    self.opaque = NO;

    // remove the default background image by replacing it with a clear image
    [self setBackgroundImage:[self.class maskedImage] forBarMetrics:UIBarMetricsDefault];

    // remove defualt bottom shadow
    [self setShadowImage: [UIImage new]]; 
}

+ (UIImage *)maskedImage {
    const float colorMask[6] = {222, 255, 222, 255, 222, 255};
    UIImage *img = [UIImage imageNamed:@"nav-white-pixel-bg.jpg"];
    return [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(img.CGImage, colorMask)];
}

@end

0

Tökezlediğim bir şey, bir alt sınıf UINavigationBaroluşturup sonra boş bir -(void)drawRect:yöntem yaratırsam, şeffaf bir gezinme çubuğu elde edeceğim. Bunu yalnızca iOS 7'de test ettim ama işe yaradı!

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.