cocoa-touch - item - navigation controller swift 4
Cambie la altura de los elementos NavigationBar y UIBarButtonItem dentro de él en Cocoa Touch (6)
Supongo que no está estrictamente en línea con las directrices de Apple, pero creo que debe ser posible de alguna manera. Me gustaría cambiar la altura de la barra de navegación dentro de UINavigationController y la altura de los elementos UIBarButtonItem dentro de esa barra.
Usando un truco de esta pregunta , logré cambiar la altura de la barra de navegación, pero no veo forma de ajustar la altura de los elementos del botón de la barra.
Si alguien sabe cómo cambiar el tamaño de los elementos del botón de la barra, por favor, ayúdeme.
¿Qué tanto quieres esto? ¿Y qué tan delgado (o grueso) quieres hacer tu barra de navegación?
Un enfoque sería configurar la transformación de la barra de navegación a escala y traducirla. Si la escala demasiado, el título y el texto del botón se verán torcidos, pero si solo necesita afeitar algunos píxeles, podría estar bien.
Aquí está el resultado de escalarlo para que sea el 75% de la altura total (33 píxeles de altura):
Y el código que produjo esto:
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.title = @"Thin Navigation Bar";
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle: @"Press Me" style:UIBarButtonItemStyleBordered target: nil action: NULL ] autorelease];
CGFloat scale = .75;
CGFloat cy = 44.0 - ( 44.0 * scale );
self.navigationController.navigationBar.transform = CGAffineTransformScale( CGAffineTransformMakeTranslation( 0, -cy / 2.0 ), 1.0, scale ) ;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
CGFloat scale = .75;
CGFloat cy = 44.0 - ( 44.0 * scale );
CGRect r = self.view.frame;
r.origin.y -= cy;
r.size.height += cy;
self.view.frame = r;
}
Ahora, esto tiene una serie de problemas, que pueden o no pueden resolverse. El # 1 es que estás luchando con UINavigationController para dimensionar y posicionar la barra de navegación y las vistas del controlador de vista. Animar entre los controladores de vista que usan esta técnica probablemente se verá extraño.
Tendría curiosidad si pudieras resolver los problemas relacionados ...
Un último pensamiento: si no usas un controlador de control UIN, entonces realmente no hay muchos problemas con este otro texto que no sea aplastado. O bien, puede usar un controlador de navegación pero ocultar la barra de navegación predeterminada y agregar la barra de navegación delgada a cada una de las vistas del controlador de vista de niño. Incluso puedes subclase UINavigationBar y establecer la transformación desde dentro:
@interface TSThinNavBar : UINavigationBar
{
}
@end
@implementation TSThinNavBar
// assuming we''ll always be constructed from a nib
- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder: aDecoder];
if ( self != nil )
{
CGFloat scale = .75;
CGFloat cy = 44.0 - ( 44.0 * scale );
self.transform = CGAffineTransformScale( CGAffineTransformMakeTranslation( 0, -cy / 2.0 ), 1.0, scale ) ;
}
return self;
}
@end
Esta es mi solución. Funciona muy bien.
@interface UINavigationBar (CustomHeight)
@end
@implementation UINavigationBar (CustomHeight)
- (CGSize)sizeThatFits:(CGSize)size {
// Change navigation bar height. The height must be even, otherwise there will be a white line above the navigation bar.
CGSize newSize = CGSizeMake(self.frame.size.width, 40);
return newSize;
}
-(void)layoutSubviews {
[super layoutSubviews];
// Make items on navigation bar vertically centered.
int i = 0;
for (UIView *view in self.subviews) {
NSLog(@"%i. %@", i, [view description]);
i++;
if (i == 0)
continue;
float centerY = self.bounds.size.height / 2.0f;
CGPoint center = view.center;
center.y = centerY;
view.center = center;
}
}
Quizás este tutorial sobre una barra de navegación personalizada te ayude a: Recrear la barra de navegación temática de iBooks wood
Si crea un elemento BarButtonItem
con un UIImageView
, puede cambiar el tamaño de marco / límite del UIImageView personalizado.
UIImageView* imageView = [[[UIImageView alloc] initWithFrame:navigationController.navigationBar.frame] autorelease];
imageView.contentMode = UIViewContentModeLeft;
imageView.image = [UIImage imageNamed:@"NavBar-iPhone.png"];
[navigationController.navigationBar insertSubview:imageView atIndex:0];
Por lo tanto, para su necesidad, debe -initWithFrame
los valores apropiados al método -initWithFrame
.
UINavigationBar
hacer algo similar subclasificando UINavigationBar
y anulando -layoutSubviews
. El código se ve como:
-(void)layoutSubviews {
[super layoutSubviews];
int i = 0;
for (UIView *view in self.subviews) {
NSLog(@"%i. %@", i++, [view description]);
if ([view isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
view.frame = CGRectMake(0, 0, 100, 50);
}
}
}
Si necesita saber cómo UINavigationBar
, UINavigationBar
un vistazo a esta muy buena respuesta .
No estoy realmente seguro de la parte NSClassFromString (@ "UINavigationButton")]. Funciona, pero lo hice como un experimento, y no estoy seguro de si Apple lo aprobará. Espero que alguien con un mejor conocimiento pueda arrojar algo de luz.
Para la barra de navegación de UIN
En iOS SDK 4.3 y posterior, hay una forma (hack) de cambiar la altura de la barra de UINavigation.
Para cambiar la altura de UINavigationController, cambie el tamaño de su marco en la función viewWillAppear:animated:
Luego, la altura se mantendrá personalizada a lo largo de toda la aplicación.
Para los artículos de UIBarButton
De hecho, me he encontrado con esto y lo único que se me ocurrió fue aprovechar initWithCustomView y pasar un UIButton con un marco definido.
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
/*
* Insert button styling
*/
button.frame = CGRectMake(0, 0, width, height);
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
De lo contrario, UIBarButtonItem solo tiene una propiedad de ancho que se puede establecer, pero desafortunadamente no es una propiedad de altura. Otra cosa ingeniosa que he hecho con initWithCustomView es pasar una barra de herramientas con un botón y otras cosas como indicadores de actividad. Espero que esto ayude.
static CGFloat const CustomNavigationBarHeight = 74;
@implementation WTNavigationBar
- (CGSize)sizeThatFits:(CGSize)size{
size.width = 1024;
size.height = CustomNavigationBarHeight;
return size;
}
-(void)layoutSubviews {
[super layoutSubviews];
for (UIView *view in self.subviews) {
SFLog(@"view.class=%@",[view class]);
if ([view isKindOfClass:NSClassFromString(@"UINavigationItemButtonView")]) {
float centerY = self.bounds.size.height / 2.0f;
CGPoint center = view.center;
center.y = centerY;
view.center = center;
}
}
}
@end
en mi aplicación para iPad, que tiene una orientación horizontal fija, descubrí que tengo que codificar el ancho del tamaño