2009-02-11 19 views
9

Ich versuche eine App mit einem UIPicker im Querformat zu entwickeln, die (fast) die gesamte Breite des Bildschirms (mit 5 oder 6 Komponenten) einnimmt. Kannst du mir bitte sagen, wie ich die Größe von UIPicker einstellen soll? Vielen Dank für Ihre Hilfe.UIPicker Sizing im Querformat

Antwort

4

Sie können nicht. Die Größe von UIPickerView ist konstant.

UPDATE: Es stellt sich heraus Sie können eine UIPickerView ändern. Der Trick besteht darin, sie in eine andere (kleinere) UIView einzufügen und ihre Größe zu ändern. Ich habe das noch nicht ausprobiert.

UPDATE 2: Diese Methode ändert die Größe von UIPickerView nicht, sondern schneidet sie ab. Es könnte sein, oder nicht, was Sie suchen, aber AFAIK, es gibt keine Möglichkeit, die Größe eines UIPickerView wirklich zu ändern, und das ist so nah wie es geht. Es sieht nicht dass schlecht aus.

UPDATE 3 (Überfällig): Ab SDK 3.0 kann UIPickerView mit initWithFrame oder setFrame vollständig in der Größe geändert werden.

0

Ich bin ziemlich sicher, dass der UIPicker in einer Größe kommt, die Sie nicht ändern können. Würde mich interessieren, anders zu hören.

4

Sie können die Größe bearbeiten, indem Sie die .xib-Datei in TextEdit öffnen und die Größe von UIPickerView ändern.

9

Eigentlich habe ich die Größe meiner Picker für fast jede App angepasst. Ich mag es nicht, dass sie den ganzen Bildschirm einnehmen. Hier ist die Methode, die ich benutze: (beachten Sie, dass ich auch den Picker am rotierenden horizontal zu sein)

in viewDidLoad .....

picker = [[UIPickerView alloc] initWithFrame:CGRectZero]; 
picker.delegate = self; 
picker.dataSource = self; 
picker.showsSelectionIndicator = NO; 


//Resize the picker, rotate it so that it is horizontal and set its position 
CGAffineTransform rotate = CGAffineTransformMakeRotation(-1.57); 
rotate = CGAffineTransformScale(rotate, .46, 2.25); 
CGAffineTransform t0 = CGAffineTransformMakeTranslation(3, 22.5); 
picker.transform = CGAffineTransformConcat(rotate,t0); 
[self.view addSubview:picker]; 
[picker release]; 

Dann Ich mag ein Hintergrundbild hinzuzufügen, für Meine Ansicht, die die grauen Balken (die nun an der Ober- und Unterseite) des UIPicker zudeckt:

//Create the overlay to superimpose ontop of the picker 
//In this case, the image is the size of the screen with a transparent area the size of the //UIPickerView cut out in the middle 

UIImageView *uiiv = [[UIImageView alloc] 
        initWithImage:[UIImage         imageNamed:@"problem_bg.png"]]; 
uiiv.userInteractionEnabled = NO; 
uiiv.opaque = YES; //for performance 
[self.view addSubview:uiiv]; 
[uiiv release]; 

UIPickerView Delegatmethode:

-(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)rowforComponent:(NSInteger)component reusingView:(UIView *)view 
{ 

    UIView *viewForRow = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 280)] autorelease]; 
    UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myimage.png"]]; 

    img.frame = CGRectMake(0, 0, 102,280); 
    img.opaque = YES; 
    [viewForRow addSubview:img]; 
    [img release]; 
    UILabel *label; 

    UIFont *font = [ UIFont fontWithName:@"Helvetica" size:20]; 

    label = [[[UILabel alloc] initWithFrame:CGRectMake(10, 20, 270, 100)] autorelease]; 

    label.text = @"I am a label"; 
    label.textAlignment = UITextAlignmentCenter; 
    label.textColor = [UIColor blackColor]; 
    label.font = font; 
    label.backgroundColor = [UIColor clearColor]; 
    label.opaque = NO; 
     [viewForRow addSubview:label]; 

    CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57); 
     [viewForRow setTransform:rotate]; 
    return viewForRow; 

} 

Dies ergibt einen viel kleineren, horizontalen Picker mit einer schönen Optik und Haptik. Ich hoffe, das hilft jemandem.

+0

Es half mir, Dank einer Million – qui

0

Kein Problem (ich habe mich gerade angemeldet). Übrigens habe ich gerade festgestellt, dass die Methode (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent .... den Abstand zwischen row und forComponent verloren hat, als ich meine Antwort gepostet habe. Stellen Sie also sicher, dass der Delegat korrekt ist, sonst funktioniert es nicht.

0

Die Antwort ist in:

-(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { 

Da mit:

- (NSString*)pickerView:(UIPickerView*)pv titleForRow:(NSInteger)row forComponent:(NSInteger)component 

macht die Arbeit es (das heißt: seitlich mit skalierten Label) natürlich

1

ich mit dem gleichen Problem gerungen Größenänderung des Picker Views. Nach etwas Forschung und Kopfschmerzen hier ist etwas, was Sie leicht tun können:

  1. Vergessen Sie Interface Builder!Ich denke, Sie können so viel besser UI ohne der Schnittstelle Builder.
  2. In Ihren Controllern überschreiben Sie die Lastansichtsmethode.

    -(void)loadView 
    { 
         //create your view 
    self.view = [[UIView alloc] initWithFrame:CGRectZero]; 
    // create a default sized pickerView 
    pickerView = [[UIPickerView alloc] initWithFrame:CGRectZero]; 
    pickerView.delegate = self; 
    pickerView.dataSource = self; 
    pickerView.showsSelectionIndicator = YES; 
    
        // Get its frame 
    CGRect pickerFrame = pickerView.frame; 
    
        // Set it to what ever you like, I use a default screen height times a shrink factor like 0.75 for 3/4 of its original size 
    pickerFrame.size.width = screenWidth*pickerShrinkFactor; 
    pickerFrame.size.height = pickerHeight*pickerShrinkFactor; 
    // You can also set the upper left corner of the picker 
    pickerFrame.origin.x = 0; 
    // Set the picker frame to new size and origin 
         pickerView.frame = pickerFrame; 
         // Add it to your view 
    [self.view addSubview:pickerView]; 
    
    } 
    

Viel Glück