È possibile modificare l'altezza di UIPickerView? Alcune applicazioni sembrano avere PickerView più brevi ma l'impostazione di un frame più piccolo non sembra funzionare e il frame è bloccato in Interface Builder.
È possibile modificare l'altezza di UIPickerView? Alcune applicazioni sembrano avere PickerView più brevi ma l'impostazione di un frame più piccolo non sembra funzionare e il frame è bloccato in Interface Builder.
Risposte:
Sembra ovvio che Apple non inviti particolarmente al muck con l'altezza predefinita di UIPickerView
, ma ho scoperto che puoi ottenere un cambiamento nell'altezza della vista assumendo il controllo completo e passando una dimensione del fotogramma desiderata al momento della creazione, ad esempio:
smallerPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)];
Scoprirai che a varie altezze e larghezze ci sono difetti visivi. Ovviamente, questi difetti dovrebbero essere risolti in qualche modo o scegliere un'altra dimensione che non li mostri.
Nessuno degli approcci di cui sopra funziona in iOS 4.0
L'altezza di pickerView non è più ridimensionabile. C'è un messaggio che viene scaricato sulla console se si tenta di modificare il frame di un selettore in 4.0:
-[UIPickerView setFrame:]: invalid height value 66.0 pinned to 162.0
Ho finito per fare qualcosa di abbastanza radicale per ottenere l'effetto di un selettore più piccolo che funziona sia con OS 3.xx che con OS 4.0. Ho lasciato il selettore alla dimensione che l'SDK decide che dovrebbe essere e invece ho creato una finestra trasparente tagliata sulla mia immagine di sfondo attraverso la quale il selettore diventa visibile. Quindi è sufficiente posizionare il selettore dietro (in base all'ordine Z) il mio sfondo UIImageView in modo che sia visibile solo una parte del selettore che è dettata dalla finestra trasparente nel mio sfondo.
Ci sono solo tre altezze valide per UIPickerView (162.0, 180.0 and 216.0)
.
È possibile utilizzare le funzioni CGAffineTransformMakeTranslation
e CGAffineTransformMakeScale
per adattare correttamente il selettore alla propria comodità.
Esempio:
CGAffineTransform t0 = CGAffineTransformMakeTranslation (0, pickerview.bounds.size.height/2);
CGAffineTransform s0 = CGAffineTransformMakeScale (1.0, 0.5);
CGAffineTransform t1 = CGAffineTransformMakeTranslation (0, -pickerview.bounds.size.height/2);
pickerview.transform = CGAffineTransformConcat (t0, CGAffineTransformConcat(s0, t1));
Il codice precedente modifica l'altezza della visualizzazione del selettore a metà e lo riposiziona nella posizione esatta (Sinistra-x1, Alto-y1) .
Provare:
pickerview.transform = CGAffineTransformMakeScale(.5, 0.5);
In iOS 4.2 e 4.3 funziona quanto segue:
UIDatePicker *datePicker = [[UIDatePicker alloc] init];
datePicker.frame = CGRectMake(0, 0, 320, 180);
[self addSubview:datePicker];
Quanto segue non funziona:
UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 320, 180)];
[self addSubview:datePicker];
Ho un'app che si trova nell'app store con un selettore di date a 3 righe. Ho pensato che il cambio di altezza potesse essere stato impedito perché vedi il testo sotto il bordo del selettore di date, ma questo accade anche al normale selettore di date 216 di altezza.
Qual è il bug? La tua ipotesi è buona quanto la mia.
Inoltre ci sono 3 altezze valide per UIDatePicker
(e UIPickerView
) 162,0, 180,0 e 216,0. Se imposti UIPickerView
un'altezza su qualsiasi altra cosa, vedrai quanto segue nella console durante il debug su un dispositivo iOS.
2011-09-14 10:06:56.180 DebugHarness[1717:707] -[UIPickerView setFrame:]: invalid height value 300.0 pinned to 216.0
A partire da iOS 9, puoi modificare liberamente UIPickerView
la larghezza e l'altezza. Non è necessario utilizzare gli hack di trasformazione sopra menzionati.
Ho scoperto che puoi modificare la dimensione di UIPickerView, ma non con il generatore di interfacce. apri il file .xib con un editor di testo e imposta la dimensione della visualizzazione del selettore come preferisci. Il generatore di interfacce non ripristina le dimensioni e sembra funzionare. Sono sicuro che Apple abbia bloccato le dimensioni per un motivo, quindi dovrai sperimentare dimensioni diverse per vedere cosa funziona.
UIPickerView
comporti come dovrebbeUIViewController
viewWillLayoutSubviews
per riscalare / posizionare il fileUIPickerView
UIPopover
UIPickerView
pickerView viewForRow
per annullare la trasformazione per le viste secondarieSottoclasse UIPickerView e sovrascrivi i due metodi usando il codice seguente. Combina sottoclassi, altezza fissa e approccio di trasformazione.
#define FIXED_PICKER_HEIGHT 216.0f
- (void) setFrame:(CGRect)frame
{
CGFloat targetHeight = frame.size.height;
CGFloat scaleFactor = targetHeight / FIXED_PICKER_HEIGHT;
frame.size.height = FIXED_PICKER_HEIGHT;//fake normal conditions for super
self.transform = CGAffineTransformIdentity;//fake normal conditions for super
[super setFrame:frame];
frame.size.height = targetHeight;
CGFloat dX=self.bounds.size.width/2, dY=self.bounds.size.height/2;
self.transform = CGAffineTransformTranslate(CGAffineTransformScale(CGAffineTransformMakeTranslation(-dX, -dY), 1, scaleFactor), dX, dY);
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
//Your code goes here
CGFloat inverseScaleFactor = FIXED_PICKER_HEIGHT/self.frame.size.height;
CGAffineTransform scale = CGAffineTransformMakeScale(1, inverseScaleFactor);
view.transform = scale;
return view;
}
Un modo semplice per modificare l'altezza visibile di una vista di selezione è incorporare il selettore in una vista UIV, regolare l'altezza della vista principale all'altezza che si desidera vedere del selettore, quindi abilitare "Clip Subviews" in Interface Builder nella UIView principale o impostato view.clipsToBounds = true
nel codice.
Clip Subviews
. anche la taglia UIPickerView
deve essere più alta - e devi mirare al centro del tuo UIPickerView
per essere visibile all'interno del genitoreUIView
UIPickerView
dal codice).
Non sono stato in grado di seguire nessuno dei consigli di cui sopra.
Ho guardato più tutorial e ho trovato questo il più vantaggioso:
Ho aggiunto il seguente codice per impostare la nuova altezza all'interno del metodo "viewDidLoad", che ha funzionato nella mia app.
UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)];
[self.view addSubview:picker];
picker.delegate = self;
picker.dataSource = self;
Spero sia stato utile!
Questo è cambiato molto in iOS 9 (in iOS 8 è abbastanza simile a quello che vediamo qui). Se puoi permetterti di scegliere come target solo iOS 9, ridimensiona UIPickerView
come ritieni opportuno, impostando la sua cornice. Buona!
Eccolo dalle note di rilascio di iOS 9
UIPickerView e UIDatePicker ora sono ridimensionabili e adattivi: in precedenza, queste viste imponevano una dimensione predefinita anche se si tentava di ridimensionarle. Queste visualizzazioni ora impostano una larghezza predefinita di 320 punti su tutti i dispositivi, invece che sulla larghezza del dispositivo su iPhone.
Le interfacce che si basano sulla vecchia applicazione della dimensione predefinita risulteranno probabilmente sbagliate quando vengono compilate per iOS 9. Eventuali problemi riscontrati possono essere risolti vincolando o ridimensionando completamente le visualizzazioni di selezione alla dimensione desiderata invece di fare affidamento sul comportamento implicito.
Sto lavorando con ios 7, Xcode 5. Sono stato in grado di regolare l'altezza del selettore di data indirettamente racchiudendolo in una vista. L'altezza delle viste del contenitore può essere regolata.
Crea una vista in IB o codice. Aggiungi il tuo selettore come vista secondaria di questa vista. Ridimensiona la vista. Questo è più facile da fare in IB. Crea vincoli dalla vista alla sua superview e dal selettore a questa nuova vista.
Poiché il selettore si curva intorno ad esso si riversa sopra e sotto la vista. Puoi vedere in IB quando aggiungi i vincoli top e bottom dal selettore alla vista che mostra uno spazio standard qualcosa come 16 punti sopra e sotto il contenitore superview. Imposta la vista per ritagliarla se non vuoi questo comportamento (brutto avvertimento).
Ecco come appare a 96 punti di altezza su un iPhone 5. Il selettore con lo spillover è alto circa 130 punti. Piuttosto magro!
Lo sto usando nel mio progetto per evitare che il raccoglitore si diffonda a un'altezza non necessaria. Questa tecnica lo riduce e forza una fuoriuscita più stretta. In realtà sembra più liscio per essere un po 'più compatto.
Ecco un'immagine della vista che mostra lo spillover.
Ecco i vincoli IB che ho aggiunto.
Anche se non si ridimensiona, un altro trucco può essere d'aiuto nella situazione in cui l'UIPicker si trova nella parte inferiore dello schermo.
Si può provare a spostarlo leggermente verso il basso, ma la riga centrale dovrebbe rimanere visibile. Ciò aiuterà a rivelare un po 'di spazio sopra il selettore poiché le righe inferiori saranno fuori schermo.
Ripeto che questo non è il modo per cambiare l'altezza della vista di UIPicker ma qualche idea su cosa puoi fare se tutti gli altri tentativi falliscono.
Ok, dopo aver lottato a lungo con la stupida vista di selezione in iOS 4, ho deciso di cambiare il mio controllo in una semplice tabella: ecco il codice:
ComboBoxView.m = which is actually looks more like pickerview.
//
// ComboBoxView.m
// iTrophy
//
// Created by Gal Blank on 8/18/10.
//
#import "ComboBoxView.h"
#import "AwardsStruct.h"
@implementation ComboBoxView
@synthesize displayedObjects;
#pragma mark -
#pragma mark Initialization
/*
- (id)initWithStyle:(UITableViewStyle)style {
// Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
if ((self = [super initWithStyle:style])) {
}
return self;
}
*/
#pragma mark -
#pragma mark View lifecycle
/*
- (void)viewDidLoad {
[super viewDidLoad];
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
*/
/*
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
}
*/
/*
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
*/
/*
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
}
*/
/*
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
}
*/
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
return [[self displayedObjects] count];
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %i", indexPath.row];
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
//cell.contentView.frame = CGRectMake(0, 0, 230.0,16);
UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 5, 230.0,19)] autorelease];
VivatAwardsStruct *vType = [displayedObjects objectAtIndex:indexPath.row];
NSString *section = [vType awardType];
label.tag = 1;
label.font = [UIFont systemFontOfSize:17.0];
label.text = section;
label.textAlignment = UITextAlignmentCenter;
label.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
label.adjustsFontSizeToFitWidth=YES;
label.textColor = [UIColor blackColor];
//label.autoresizingMask = UIViewAutoresizingFlexibleHeight;
[cell.contentView addSubview:label];
//UIImage *image = nil;
label.backgroundColor = [UIColor whiteColor];
//image = [awards awardImage];
//image = [image imageScaledToSize:CGSizeMake(32.0, 32.0)];
//[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
//UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
//cell.accessoryView = imageView;
//[imageView release];
}
return cell;
}
/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the specified item to be editable.
return YES;
}
*/
/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
*/
/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/
/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the item to be re-orderable.
return YES;
}
*/
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic may go here. Create and push another view controller.
/*
<#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
// ...
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
*/
}
#pragma mark -
#pragma mark Memory management
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Relinquish ownership any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
// Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
// For example: self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
Ecco il file .h per questo:
//
// ComboBoxView.h
// iTrophy
//
// Created by Gal Blank on 8/18/10.
//
#import <UIKit/UIKit.h>
@interface ComboBoxView : UITableViewController {
NSMutableArray *displayedObjects;
}
@property (nonatomic, retain) NSMutableArray *displayedObjects;
@end
now, in the ViewController where I had Apple UIPickerView I replaced with my own ComboBox view and made it size what ever I wish.
ComboBoxView *mypickerholder = [[ComboBoxView alloc] init];
[mypickerholder.view setFrame:CGRectMake(50, 220, 230, 80)];
[mypickerholder setDisplayedObjects:awardTypesArray];
questo è tutto, ora l'unica cosa che resta è creare una variabile membro nella vista della casella combinata che manterrà la selezione della riga corrente, e siamo a posto.
Goditi tutti.
In genere non è possibile farlo in xib o impostando il frame in modo programmatico, ma se si apre il suo xib genitore come sorgente e si modifica l'altezza da lì, allora funziona. in quel tag, cambia l'altezza lì e salva il file.
<pickerView contentMode="scaleToFill" id="pai-pm-hjZ">
<rect key="frame" x="0.0" y="41" width="320" height="100"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<connections>
<outlet property="dataSource" destination="-1" id="Mo2-zp-Sl4"/>
<outlet property="delegate" destination="-1" id="nfW-lU-tsU"/>
</connections>
</pickerView>
Per quanto ne so, è impossibile ridurre l'UIPickerView. Inoltre non ne ho mai visto uno più corto usato da nessuna parte. La mia ipotesi è che fosse un'implementazione personalizzata se sono riusciti a ridurla.
Se desideri creare il tuo selettore in IB, puoi post-ridimensionarlo a una dimensione inferiore. Controlla per assicurarti che disegni ancora correttamente, poiché arriva un punto in cui sembra atroce.
Swift : è necessario aggiungere una sottoview con clip ai limiti
var DateView = UIView(frame: CGRectMake(0, 0, view.frame.width, 100))
DateView.layer.borderWidth=1
DateView.clipsToBounds = true
var myDatepicker = UIDatePicker(frame:CGRectMake(0,-20,view.frame.width,162));
DateView.addSubview(myDatepicker);
self.view.addSubview(DateView)
Questo dovrebbe aggiungere un selettore di date con altezza 100 ritagliata nella parte superiore del controller della vista.
Il mio trucco: usa il livello maschera di DatePicker per rendere visibile una parte di datePicker. come vedi proprio come cambiare la cornice del datepicke.
- (void)timeSelect:(UIButton *)timeButton {
UIDatePicker *timePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 550)];
timePicker.backgroundColor = [UIColor whiteColor];
timePicker.layer.mask = [self maskLayerWithDatePicker:timePicker];
timePicker.layer.masksToBounds = YES;
timePicker.datePickerMode = UIDatePickerModeTime;
[self.view addSubview:timePicker];
}
- (CALayer *)maskLayerWithDatePicker:(UIDatePicker *)datePicker {
CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, datePicker.width*0.8, datePicker.height*0.8) cornerRadius:10];
shapeLayer.path = path.CGPath;
return shapeLayer;
}
Incorpora in una visualizzazione stack. La visualizzazione stack è un componente aggiunto di recente da Apple nel proprio SDK iOS per riflettere le implementazioni basate su griglia nelle librerie front-end basate sul Web di java script come bootstrap.
Come accennato in precedenza UIPickerView
è ora ridimensionabile. Voglio solo aggiungere che se vuoi cambiare l'altezza del pickerView in una cella tableView, non ho avuto alcun successo con l'impostazione dell'ancora di altezza su una costante. Tuttavia, l'utilizzo lessThanOrEqualToConstant
sembra funzionare.
class PickerViewCell: UITableViewCell {
let pickerView = UIPickerView()
func setup() {
// call this from however you initialize your cell
self.contentView.addSubview(self.pickerView)
self.pickerView.translatesAutoresizingMaskIntoConstraints = false
let constraints: [NSLayoutConstraint] = [
// pin the pickerView to the contentView's layoutMarginsGuide
self.pickerView.leadingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.leadingAnchor),
self.pickerView.topAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.topAnchor),
self.pickerView.trailingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.trailingAnchor),
self.pickerView.bottomAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.bottomAnchor),
// set the height using lessThanOrEqualToConstant
self.pickerView.heightAnchor.constraint(lessThanOrEqualToConstant: 100)
]
NSLayoutConstraint.activate(constraints)
}
}
Dopo una lunga giornata passata a grattarmi la testa, ho trovato qualcosa che funziona per me. I codici seguenti ricreano l'UIDatePicker ogni volta che l'utente cambia l'orientamento del telefono. Questo rimuoverà tutti i difetti che l'UIDatePicker ha dopo un cambio di orientamento.
Poiché stiamo ricreando l'UIDatePicker, abbiamo bisogno di una variabile di istanza che manterrà il valore della data selezionato. I codici seguenti sono testati su iOS 4.0.
@interface AdvanceDateViewController : UIViewController<UIPickerViewDelegate> {
UIDatePicker *datePicker;
NSDate *date;
}
@property (nonatomic, retain) UIDatePicker *datePicker;
@property (nonatomic, retain) NSDate *date;
-(void)resizeViewWithOrientation:(UIInterfaceOrientation) orientation;
@end
@implementation AdvanceDateViewController
@synthesize datePicker, date;
- (void)viewDidLoad {
[super viewDidLoad];
[self resizeViewWithOrientation:self.interfaceOrientation];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self resizeViewWithOrientation:self.interfaceOrientation];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
[self resizeViewWithOrientation:toInterfaceOrientation];
}
-(void)resizeViewWithOrientation:(UIInterfaceOrientation) orientation{
[self.datePicker removeFromSuperview];
[self.datePicker removeTarget:self action:@selector(refreshPickupDate) forControlEvents:UIControlEventValueChanged];
self.datePicker = nil;
//(Re)initialize the datepicker, thanks to Apple's buggy UIDatePicker implementation
UIDatePicker *dummyDatePicker = [[UIDatePicker alloc] init];
self.datePicker = dummyDatePicker;
[dummyDatePicker release];
[self.datePicker setDate:self.date animated:YES];
[self.datePicker addTarget:self action:@selector(refreshPickupDate) forControlEvents:UIControlEventValueChanged];
if(UIInterfaceOrientationIsLandscape(orientation)){
self.datePicker.frame = CGRectMake(0, 118, 480, 162);
} else {
self.datePicker.frame = CGRectMake(0, 200, 320, 216);
}
[self.view addSubview:self.datePicker];
[self.view setNeedsDisplay];
}
@end
stockPicker = [[UIPickerView alloc] init];
stockPicker.frame = CGRectMake(70.0,155, 180,100);
Se vuoi impostare la dimensione di UiPickerView. Il codice sopra funzionerà sicuramente per te.
In iOS 5.0, ho ottenuto quanto segue per funzionare:
UIDatePicker *picker = [[UIDatePicker alloc] init];
picker.frame = CGRectMake(0.0, 0.0, 320.0, 160.0);
Questo ha creato un selettore di date come quello che Apple utilizza nell'app Calendario quando crea un nuovo evento in modalità orizzontale. (3 righe di altezza invece di 5.) Questo non ha funzionato quando ho impostato il frame all'interno del initWithFrame:
metodo, ma finora funziona quando lo ho impostato utilizzando un metodo separato.
per iOS 5:
se dai una rapida occhiata al riferimento al protocollo UIPickerView
lo troverai
– pickerView:rowHeightForComponent:
– pickerView:widthForComponent:
Penso sia il primo che stai cercando
pickerView:rowHeightForComponent:
è il metodo delegato per decidere l'altezza di ogni riga, non l'altezza della vista di selezione.