custom bar iphone uiview uinavigationbar uinavigationitem

iphone - custom - ¿Cómo puedo obtener un título de UINavigationBar de tamaño completo?



set navigation bar swift (6)

CGRect frame = CGRectMake (0, 0, 320, 44);

UILabel *titlelabel = [[UILabel alloc]initWithFrame:frame]; titlelabel.textAlignment = UITextAlignmentCenter; titlelabel.backgroundColor = [UIColor clearColor]; titlelabel.textColor = [UIColor whiteColor]; titlelabel.font = [UIFont systemFontOfSize:20]; titlelabel.text =@"Available Reports"; self.navigationItem.titleView = titlelabel;

Si desea configurar la imagen, tome la vista de uiimage en lugar de uilable, puede crear cualquier vista de la barra de navegación completa. Dígame cómo luce su navegación. Le enviaré un código para eso. Si lo desea, también puedo poner el botón 6 en la navegación.

Estoy tratando de agregar un control personalizado como titleView en una barra de UINavigation. Cuando lo hago, a pesar de establecer el marco y las propiedades que normalmente asumirían todo el ancho, obtengo esto:

El azul brillante se puede ignorar ya que es donde estoy ocultando mi control personalizado. El problema es las tiras estrechas de la barra de navegación en los extremos de la barra. ¿Cómo puedo deshacerme de estos para que mi vista personalizada se extienda al 100%?

CGRect frame = CGRectMake(self.view.bounds.origin.x, self.view.bounds.origin.y, self.view.width, kDefaultBarHeight); UANavBarControlView *control = [[[UANavBarControlView alloc] initWithFrame:frame] autorelease]; control.autoresizingMask = UIViewAutoresizingFlexibleWidth; self.navigationItem.titleView = control;

PD: Sé que puedo agregar la vista por sí misma en lugar de adjuntarla a una barra de navegación y sería muy fácil ubicarla. Tengo mis razones para necesitar que esté "en" la barra de navegación, y esas razones están here


Configurar el títuloVista del elemento de navegación de tu vista nunca hará el truco. En su lugar, puede agregar un subView a la barra de navegación del controlador de navegación:

UIView* ctrl = [[UIView alloc] initWithFrame:navController.navigationBar.bounds]; ctrl.backgroundColor = [UIColor yellowColor]; ctrl.autoresizingMask = UIViewAutoresizingFlexibleWidth; [navController.navigationBar addSubview:ctrl];


El siguiente código redactado en iOS8 / iOS9 / iOS10 / iOS11 .

Código en swift 3

class TitleView: UIView { override var frame: CGRect { get { return super.frame } set { super.frame = newValue.insetBy(dx: -newValue.minX, dy: 0) } } override func didMoveToSuperview() { if let superview = superview { frame = superview.bounds translatesAutoresizingMaskIntoConstraints = true autoresizingMask = [.flexibleWidth, .flexibleHeight] } } override func updateConstraints() { super.updateConstraints() /// remove autolayout warning in iOS11 superview?.constraints.forEach { constraint in if fabs(constraint.constant) == 8 { constraint.isActive = false } } } }


Solo encontré el mismo problema y después de un poco de pensamiento lo resolví. El marco de titleView se establece mediante la barra de navegación cada vez que aparece.

Todo lo que tienes que hacer es la subclase UIView y anular setFrame .

Me gusta esto:

- (void)setFrame:(CGRect)frame { [super setFrame:CGRectMake(0.0, 0.0, 320.0, 50.0)]; }

Ahora establezca su nueva vista de UIView como navigationItem.titleView y disfrute de su nueva resistencia al cambio de tamaño mediante la vista de supervisión.

No tienes que establecer el marco de súper cada vez que se establece tu marco. Solo puedes configurarlo una vez y listo. Si desea admitir cambios de orientación, probablemente también podría piratearlo.


Versión rápida de la respuesta de ksm

let leftOffset: CGFloat = 60 let rightOffset: CGFloat = 60 @objc override var frame: CGRect { didSet { let width: CGFloat = UIScreen.main.bounds.width - leftOffset - rightOffset let height: CGFloat = 44 super.frame = CGRect( x: leftOffset, y: 20, width: width, height: height ) } }


gracias a @VdesmedT por las respuestas, he estado usando esta respuesta para lograr un título de pantalla completa en la barra de navegación.

Pero, acabo de actualizar a iOS11 recientemente y encontré que esta solución no funcionó. Y así lo descubrí de otra manera (puede parecer extraño). El núcleo de la idea no es cambiar el tamaño de la vista de título, sino cambiar las subvistas de la barra para lograr que la barra de pantalla completa se vea afectada.

  1. haga una vista de barra (asegúrese de que el ancho de la vista de barra sea screenSize - 12 * 2, 12 es el sistema de relleno del sistema configurado para ver título, puede usar el diseño manual o la restricción de autolayout para lograr esto). y luego configurarlo como el título de la barra de navegación
  2. agrega tus componentes en este barView. puede alinear los componentes desde -12 al ancho de barView + 12
  3. sobrecargue el punto interior de su barView, para que pueda responder incluso cuando el clic haya salido del barView.

    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { BOOL ret = [super pointInside:point withEvent:event]; if (ret == NO) { CGRect expandRect = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsMake(0, -12, 0, -12)); ret = CGRectContainsPoint(expandRect, point); } return ret; }