Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
344 views
in Technique[技术] by (71.8m points)

ipad - change color navigation controller in a popover

I'm having a problem with trying to change the colour of my navigation controller inside my popoverController.
I'm trying to do something like this:

if (self.popoverController == nil) {
    ArtistsViewController *artistsViewController = 
    [[ArtistsViewController alloc]      
     initWithNibName:@"ArtistsViewController" 
     bundle:[NSBundle mainBundle]]; 

    artistsViewController.navigationItem.title = @"Artists";
    UINavigationController *navController = 
    [[UINavigationController alloc] 
     initWithRootViewController:artistsViewController];


    UIPopoverController *popover = 
    [[UIPopoverController alloc] 
     initWithContentViewController:artistsViewController.navigationController];
    artistsViewController.navigationController.navigationBar.tintColor=[UIColor greenColor];

    popover.delegate = self;
    [artistsViewController release];
    [navController release];

    self.popoverController = popover;
    [popover release];
}

[self.popoverController 
 presentPopoverFromBarButtonItem:sender                                    
 permittedArrowDirections:UIPopoverArrowDirectionAny 
 animated:YES];

but it doesn't work. any suggestions?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

////////////////////////////////////////

////////////**SOLUTION**////////

////////////////////////////////////////

I'm gonna edit this post because i solved my problem and I think could be helpful share my solution here:

first of all, follow this sample:

http://mobiforge.com/designing/story/using-popoverview-ipad-app-development

When It is done go to step two.

The second step will be add a new popoverBackgroundViewClass:

Add new file in your project Objective class and call it 'CustomPopoverBackgroundView'

///////////////////////////////////////////////
////// CustomPopoverBackgroundView.h  /////////
///////////////////////////////////////////////

     #import < UIKit/UIKit.h >
     #import < UIKit/UIPopoverBackgroundView.h >

    @interface CustomPopoverBackgroundView : UIPopoverBackgroundView{
        UIPopoverArrowDirection direction;
        CGFloat offset;
    }

    @end

//////////////////////////////////////////////
////// CustomPopoverBackgroundView.m /////////
//////////////////////////////////////////////


    #import "CustomPopoverBackgroundView.h"

    @implementation CustomPopoverBackgroundView

     -  (void)layoutSubviews {
        [super layoutSubviews];
        CGFloat fullHeight = self.frame.size.height;
        CGFloat fullWidth = self.frame.size.width;
        CGFloat startingLeft = 0.0;
        CGFloat startingTop = 0.0;
        CGFloat arrowCoord = 0.0;

        UIImage *arrow;
        UIImageView *arrowView;

        switch (self.arrowDirection) {
            case UIPopoverArrowDirectionUp:
                startingTop += 13.0;
                fullHeight -= 13.0;
    //the image line.png will be the corner 
                arrow = [UIImage imageNamed:@"line.png"];
                arrowCoord = (self.frame.size.width / 2) - self.arrowOffset;
                arrowView = [[[UIImageView alloc] initWithFrame:CGRectMake(arrowCoord, 0, 13.0, 13.0)] autorelease];
                break;


            case UIPopoverArrowDirectionDown:
                fullHeight -= 13.0;
                arrow = [UIImage imageNamed:@"line.png"];
                arrowCoord = (self.frame.size.width / 2) - self.arrowOffset;
                arrowView = [[[UIImageView alloc] initWithFrame:CGRectMake(arrowCoord, fullHeight, 13.0, 13.0)] autorelease];
                break;

            case UIPopoverArrowDirectionLeft:
                startingLeft += 13.0;
                fullWidth -= 13.0;
                arrow = [UIImage imageNamed:@"line.png"];
                arrowCoord = (self.frame.size.height / 2) - self.arrowOffset;
                arrowView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, arrowCoord, 13.0, 13.0)] autorelease];
                break;

            case UIPopoverArrowDirectionRight:
                fullWidth -= 13.0;
                arrow = [UIImage imageNamed:@"line.png"];
                arrowCoord = (self.frame.size.height / 2) - self.arrowOffset;
                arrowView = [[[UIImageView alloc] initWithFrame:CGRectMake(self.frame.size.width-13.0, arrowCoord, 13.0, 13.0)] autorelease];
                break;

        }


        //this image will be your background
        UIImage *bg = [[UIImage imageNamed:@"lineBack.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(8.0, 8.0, 8.0, 8.0)];
        UIImageView *imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(startingLeft, startingTop, fullWidth, fullHeight)] autorelease];
        [imageView setImage:bg];
        [arrowView setImage:arrow];
        [self addSubview:imageView];
        [self addSubview:arrowView];
    }



    - (CGFloat) arrowOffset {

        return offset;

    }



    - (void) setArrowOffset:(CGFloat)arrowOffset {

        offset = arrowOffset;

        [self setNeedsLayout];

    }



    - (UIPopoverArrowDirection)arrowDirection {

        return direction;

    }



    - (void)setArrowDirection:(UIPopoverArrowDirection)arrowDirection {

        direction = arrowDirection;

        [self setNeedsLayout];

    }



    + (CGFloat)arrowHeight {

        return 30.0;

    }



    + (CGFloat)arrowBase {

        return 30.0;

    }



    + (UIEdgeInsets)contentViewInsets {

        return UIEdgeInsetsMake(30.0, 30.0, 30.0, 30.0);

    }

    @end

Third step:

When It is done add this line in 'PopOverExample1ViewController.m':

import the new class:

#import " CustomPopoverBackgroundView.h "


-(IBAction) showMovies:(id) sender {

    if (self.popoverController == nil) {
        MoviesViewController *movies = 
            [[MoviesViewController alloc] 
                initWithNibName:@"MoviesViewController" 
                         bundle:[NSBundle mainBundle]]; 

        UIPopoverController *popover = 
            [[UIPopoverController alloc] initWithContentViewController:movies]; 

        popover.delegate = self;
        [movies release];


//THIS IS THE LINE THAT YOU HAVE TO ADD


         popover.popoverBackgroundViewClass=[CustomPopoverBackgroundView class];


        self.popoverController = popover;
        [popover release];
    }

    [self.popoverController 
        presentPopoverFromBarButtonItem:sender 
               permittedArrowDirections:UIPopoverArrowDirectionAny 
                               animated:YES];    
}

-(IBAction) btnShowMovies:(id) sender {

    if (self.popoverController == nil) {
        MoviesViewController *movies = 
            [[MoviesViewController alloc] 
                initWithNibName:@"MoviesViewController" 
                         bundle:[NSBundle mainBundle]]; 

        UIPopoverController *popover = 
            [[UIPopoverController alloc] initWithContentViewController:movies]; 

        popover.delegate = self;
        [movies release];


//THIS IS THE LINE THAT YOU HAVE TO ADD


         popover.popoverBackgroundViewClass=[CustomPopoverBackgroundView class];


        self.popoverController = popover;
        [popover release];
    }

    CGRect popoverRect = [self.view convertRect:[btn frame] 
                                       fromView:[btn superview]];

    popoverRect.size.width = MIN(popoverRect.size.width, 100); 
    [self.popoverController 
        presentPopoverFromRect:popoverRect 
                        inView:self.view 
      permittedArrowDirections:UIPopoverArrowDirectionAny 
                      animated:YES];
}

Alright!!! Thats all! If someOne needs help just let me know. Best wishes!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...