سؤال

لقد تمكنت من إضافة خلفية مخصصة إلى شريط التنقل باستخدام:

UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBar.png"]];
[myViewController.navigationBar insertSubview:iv atIndex:0];
[iv release];

هذا يعمل بشكل جيد وأستطيع أن أرى العنوان و أزرار حسنا.ومع ذلك ، عندما كنت أسفل مستوى واحد ثم نعود إلى الجذر ، أزرار مخفية ، ولكن العنوان لا تزال مرئية.يظهر شريط التنقل صورة تغطي البنود زر.

أنا في حيرة أنا إدراجه في الجزء السفلي لذلك أود أن نفترض عند التنقل العناصر دفعت و برزت من أن يتم عرضها أعلاه آراء أخرى في شريط التنقل.

أي أفكار ؟

شكرا

مايك

هل كانت مفيدة؟

المحلول

في أعقاب وصف من هنا, أقترح إضافة فئة إلى شريط التنقل.

@implementation UINavigationBar (UINavigationBarCategory)

- (void)drawRect:(CGRect)rect {
    // Drawing code 
    UIImage *img = [UIImage imageNamed: @"navbar_background.png"];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, CGRectMake(0, 0, 320, self.frame.size.height), img.CGImage);

}
@end

نصائح أخرى

في دائرة الرقابة الداخلية 5 هذا لن ينجح ولكن الخبر السار هو أن هناك طريقة بسيطة للقيام بذلك

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];

ملحوظة: هذا وستعمل فقط على دائرة الرقابة الداخلية 5 وفوق ذلك تأكد من التحقق من نسخة دائرة الرقابة الداخلية إذا كنت تريد أن تكون متوافقة إلى الوراء

.

وsubviews شريط التصفح لتتغير باستمرار، يعني كل رأي تظهر / تختفي، لذلك يجب أن لا نتوقع أن يكون imageview أضاف في مؤشر 0 من مجموعة subviews.

هل يمكن أن محاولة إضافة هذا في viewDidAppear (في كل viewcontroller أن إدارة العناصر الملاحة /:):

NSLog(@"navbar's subviews before \n %@",[[[self navigationController] navigationBar] subviews]);

for (UIImageView *imgv in [[[self navigationController] navigationBar] subviews]) {
    [[[self navigationController] navigationBar] sendSubviewToBack:imgv];
}

NSLog(@"navbar's subviews after \n %@",[[[self navigationController] navigationBar] subviews]);

ولقد استخدمت حل Hauek ولكن عندما يكون شريط تمت diferent نكهة في وحدات التحكم الأخرى، يمكن أن تعطي بعض المشاكل البسيطة، على أي حال، هذا ليس الخيار الأفضل.

ونأمل أن تساعد، على الأقل أن نفهم لماذا ما كنت تفعل لم يكن يعمل،

وبدلا من أن يفعل ذلك في drawRect: يمكنك تجاوز <م> drawLayer: inContext: الأسلوب في فئة فئة UINavigationBar. داخل <م> drawLayer: inContext: الطريقة، يمكنك رسم الصورة الخلفية التي تريد استخدامها. كما يمكنك اختيار صور مختلفة للصورة واجهة المشهد التوجهات إذا كان التطبيق يدعم توجهات واجهة متعددة.

- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    if ([self isMemberOfClass:[UINavigationBar class]] == NO) {
        return;
    }

    UIImage *image = (self.frame.size.width > 320) ?
                        [UINavigationBar bgImageLandscape] : [UINavigationBar bgImagePortrait];
    CGContextClip(context);
    CGContextTranslateCTM(context, 0, image.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
}

هذا المشروع التجريبي كسكودي كامل على تخصيص مظهر UINavigationBar قد تكون مفيدة أيضا.

والطريقة التي يمكن ببساطة إضافة خلفية جديدة لUINavigationBar الخاصة بك المقبلة.

/////////
 UINavigationController *navController = [[UINavigationController alloc] init];
 UINavigationBar*bar=[navController navigationBar]; // get navigation bar 
  NSArray*barSubview=[bar subviews]; // get all subviews of bar
 UIView*backView=[arr objectAtIndex:0]; // at index 0 lying background view of our bar
 backView.alpha=0.0f;// set alpha to 0 and it will become invisible

    UIImageView*imgView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top-bar.png"]];// create the image view that we will insers as subbview in our bar
    imgView.frame=CGRectMake(0, 0, 320, 44);
    [bar insertSubview:imgView atIndex:0];// and it will be out new background
    [imgView release];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top