2014-12-02 6 views
8

मेरे आवेदन प्रतिनिधि में किया गया FinishLaunchingWithOptions फ़ंक्शन, मैं अपने नेविगेशन बार की उपस्थिति को अनुकूलित करने का प्रयास करता हूं।एक UINavigationBar के लिए एक अपारदर्शी 1px उच्च छाया छवि कैसे सेट करें?

[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 लंबा अपारदर्शी लाल छाया की उम्मीद है। इसके बजाय मुझे 2 पीएक्स लंबा पारदर्शी लाल छाया दी गई है। यह ठीक उसी तरह कैसे दिख सकता है जैसा मैं चाहता हूं? मैंने UITabBar को समान उपस्थिति सेटिंग्स की हैं। दूसरी तरफ, अच्छी तरह से व्यवहार करता है।

enter image description here

श्रेणी समारोह है कि गतिशील छवियों पैदा करता है तो के रूप में परिभाषित किया गया है:

+ (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

तुम सिर्फ CALayer के लिए एक छाया जोड़ने में देखा है

यहाँ पूर्ण कोड है? http://stackoverflow.com/questions/805872/how-do-i-draw-a-shadow-under-a-uiview – cmyr

+0

@cmyr '[UINavigationBar उपस्थिति] .layer.borderWidth = 0.5f; [UINavigationBar उपस्थिति] .layer.borderColor = [UIColor redcolor] .CGColor; 'नेविगेशन बार के नीचे कुछ भी नहीं दिखाता है। – Pwner

+0

क्या आपने परत की क्लिप को टोबाउंड को सेट किया है? – cmyr

उत्तर

-1

उह ... आप यही चाहते है?

screenshot

मेरे विचार नियंत्रक में, मैं बस 1 पिक्सेल ऊंचाई के साथ एक UIView जोड़ा गया है और 44pixels की एक ऑफसेट:

- (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]; 
} 

आप रंग जो कुछ भी करने के लिए आप चाहते हैं बदल सकते हैं।

+2

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

15

आप एक ग्राफिक्स संदर्भ कि रेटिना-बारे में पता है बनाने की जरूरत:

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

उसके बाद, अपनी छाया छवि 1 शारीरिक पिक्सेल लंबा हो जाएगा।

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 
    } 

} 

GitHub पर::

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

+0

मैं {pixelSize, pixelSize} के बजाय भरने का आकार {1, पिक्सेल आकार} बनाने का प्रस्ताव करता हूं, अन्यथा यह एक क्षैतिज ढाल प्रभाव बनाता है और लाइन मेरे मामले में दाएं बिंदु बिंदु पर पारदर्शी हो जाती है। –

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