2014-12-02 18 views
8

Uyguladığım delege'nin didFinishLaunchingWithOptions işlevinde, gezinme çubuğumun görünümünü özelleştirmeye çalışıyorum.UINavigationBar için opak 1px yüksek gölge görüntüsü nasıl ayarlanır?

[UINavigationBar appearance].translucent = NO; 
[[UINavigationBar appearance] 
    setBackgroundImage:[UIImage 
     imageWithColor:[UIColor whiteColor] 
     size:CGSizeMake(1.0f, 1.0f) 
    ] 
    forBarMetrics:UIBarMetricsDefault 
]; 
[UINavigationBar appearance].shadowImage = [UIImage 
    imageWithColor:[UIColor redColor] 
    size:CGSizeMake(0.5f, 0.5f) 
]; 

1px boyunda opak kırmızı bir gölge bekliyorum. Bunun yerine 2px boyunda yarı saydam kırmızı bir gölge verdim. Tam olarak istediğim gibi görünmesini nasıl sağlayabilirim? Benzer görünüm ayarlarını UITabBar'a yaptım. Öte yandan, güzel davranır. Dinamik görüntüler oluşturur

enter image description here

kategori işlevi böylece olarak tanımlanır:

+ (UIImage*)imageWithColor:(UIColor *)color size:(CGSize)size 
{ 
    CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height); 
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, [color CGColor]); 
    CGContextFillRect(context, rect); 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 
+0

sadece CALayer bir gölge ekleyerek içine baktım

İşte tam kodu? http://stackoverflow.com/questions/805872/how-do-i-draw-a-shadow-under-a-uiview – cmyr

+0

@cmyr '[UINavigationBar görünümü] .layer.borderWidth = 0.5f; [UINavigationBar görünüm] .layer.borderColor = [UIColor redColor] .CGColor; 'gezinme çubuğunun altında hiçbir şey göstermiyor. – Pwner

+0

, katmanın clipToTounds değerini NO olarak ayarladınız mı? – cmyr

cevap

-1

Ah ... İstediğin bu ne? Benim görünüm denetleyicisinde

screenshot

, ben sadece 1 piksel yüksekliğinde bir UIView eklendi ve 44pixels ofset:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    self.view.backgroundColor = [UIColor whiteColor]; 

    [self setupNavBar]; 
} 

-(void)setupNavBar 
{ 
    self.navigationItem.title = @"Contacts"; 

    CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame]; 

    UIView *bar = [[UIView alloc] initWithFrame:CGRectMake(0, 44, applicationFrame.size.width, 1.0)]; 
    bar.backgroundColor = [UIColor redColor]; 

    [self.navigationController.navigationBar addSubview:bar]; 
} 

İstediğinizi renk değiştirebilir.

+2

IMHO Gezinme Çubuğuna alt görünüm eklemek en iyi çözüm değil. Hata eğilimli (örneğin, birden çok görünüm denetleyicisi görünüm eklemeyi denediğinde veya - özellikle gezinme çubukları için görünüm hiyerarşisi iOS'un güncel bir sürümü ile değiştiğinde) görünür. Bunun yerine, genel kullanıma açık işlevler, özel arka plan görüntüsü ve UIAppearance ayarları kullanmanın daha güvenli olduğunu düşünüyorum. – auco

15

Sen retina farkında olan bir grafik içeriğini oluşturmak gerekir: Bundan sonra

let pixelScale = UIGraphicsBeginImageContextWithOptions(fillRect.size, false, UIScreen.main.scale) 

, gölgen görüntü 1 fiziksel piksel boyunda olacak. GitHub'dan günü

extension UIImage { 

    static func imageWithColor(color: UIColor) -> UIImage { 
     let pixelScale = UIScreen.main.scale 
     let pixelSize = 1/pixelScale 
     let fillSize = CGSize(width: pixelSize, height: pixelSize) 
     let fillRect = CGRect(origin: CGPoint.zero, size: fillSize) 
     UIGraphicsBeginImageContextWithOptions(fillRect.size, false, pixelScale) 
     let graphicsContext = UIGraphicsGetCurrentContext() 
     CGContextSetFillColorWithColor(graphicsContext, color.CGColor) 
     CGContextFillRect(graphicsContext, fillRect) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 

} 

:

https://github.com/salutis/swift-image-with-color

+0

{pixelSize, pixelSize} yerine {1, pixelSize} dolgu boyutunu oluşturmayı öneriyorum. Aksi takdirde yatay bir degrade efekti oluşturuyor ve hat benim durumumda doğru nokta noktasında saydamlaşıyor. –