Para um UIScrollView *toScrollView
(que é a largura da tela), quero adicionar uma borda inferior cinza (exatamente como a do campo de ação da exibição de composição do aplicativo de mensagens nativo do iPhone).
Para conseguir isso, segui o Cocoa Touch: Como alterar a cor e a espessura da borda do UIView? e apenas cobrimos a borda superior com o costume UINavigationBar
e fizemos a toScrollView
coordenada x -1 e a largura 322 para que as bordas esquerda e direita fiquem fora da tela.
Parece bom, mas é uma espécie de hack, e eu queria saber se há uma maneira melhor de fazer isso.
- (void)viewDidLoad {
[super viewDidLoad];
// Add UINavigationBar *navigationBar at top.
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self action:@selector(cancelAction)];
UINavigationBar *navigationBar = [[UINavigationBar alloc]
initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 44.0f)];
navigationBar.items = [NSArray arrayWithObject:self.navigationItem];
// Add UIScrollView *toScrollView below navigationBar.
UIScrollView *toScrollView = [[UIScrollView alloc]
initWithFrame:CGRectMake(-1.0f, 43.0f, 322.0f, 45.0f)];
toScrollView.backgroundColor = [UIColor whiteColor];
toScrollView.layer.borderColor = [UIColor colorWithWhite:0.8f alpha:1.0f].CGColor;
toScrollView.layer.borderWidth = 1.0f;
[self.view addSubview:toScrollView];
[self.view addSubview:navigationBar]; // covers top of toScrollView
}
Respostas:
Em vez de usar um
UIView
, como sugere @ ImreKelényi, você pode usar umCALayer
:fonte
QuartzCore framework
ao seu projeto se não o tiver, pois poderá receber erros do compilador.QuartzCore.framework
mais.43.0f
paratoScrollView.frame.size.height
se certificar de que está no fundoAqui está uma extensão Swift mais generalizada para criar borda para qualquer
UIView
subclasse:Swift 3
fonte
border.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: width)
etc.Implementado em uma categoria como abaixo:
UIButton + Border.h:
UIButton + Border.m:
fonte
Swift 4
Se você precisa de uma solução realmente adaptável (para todos os tamanhos de tela), é esta:
fonte
Você pode adicionar uma
UIView
altura separada de 1 ponto e cor de fundo cinza aeself.view
posicioná-la logo abaixotoScrollView
.fonte
Solução para Swift 4
FundoCor claraCinza. Mude a cor se você precisar.
fonte
Também há um código aprimorado com a funcionalidade de remover bordas. Baseado em resposta confil .
Atualização: Swift 3
fonte
func remove(border: ViewBorder) { layer.sublayers? .compactMap { $0 } .filter { $0.name == border.rawValue } .forEach { $0.removeFromSuperlayer() } }
O problema com esses métodos de extensão é que, quando o UIView / UIButton mais tarde ajusta seu tamanho, você não tem chance de alterar o tamanho do CALayer para corresponder ao novo tamanho. O que deixará você com uma borda fora do lugar. Eu achei que era melhor subclassificar meu UIButton, é claro que você poderia subclassificar outros UIViews também. Aqui está um código:
fonte
Ou, a maneira mais favorável ao desempenho é sobrecarregar o drawRect, simplesmente assim:
fonte
drawRect:
não é necessariamente favorável ao desempenho. Tenho certeza de que o uso de uma camada tem um desempenho muito melhor.setFrame:
,setBounds:
oulayoutSubviews
.layoutSublayersOfLayer:
vez desetFrame:
ou qualquer um dos outrosVersão Swift 3 da resposta do Confile:
Uso ao usar o layout automático:
fonte
Se você usar restrições (e não tiver o tamanho dos quadros), poderá adicionar uma vista de borda com as restrições necessárias
Em seguida, defina algo como o abaixo
(inspirado nesta resposta )
fonte
Rápido
Criar extensão UIView
Objetivo C
Criar classe de categoria de UIView
UIView + Border.h
UIView + Border.m
Uso: - Selecione qualquer controle do storyboard e, em seguida, mostre o inspetor de atributos (lado direito).
Agora você pode definir qualquer lado da cor e largura da borda.
fonte
Eu escrevi um método geral que adicionará uma borda em qualquer lado que você desejar
UIView
. Você pode definir espessura, cor, margens ezOrder
para cada lado.fonte
Você não precisa adicionar uma camada para cada borda, basta usar um caminho de bezier para desenhá-las uma vez.
fonte
Swift 4/3
Você pode usar esta solução abaixo. Ele funciona em UIBezierPaths, que são mais leves que as camadas, causando tempos de inicialização rápidos. É fácil de usar, veja as instruções abaixo.
fonte
Swift 4
Baseado em: https://stackoverflow.com/a/32821607/9980800
UIView + Border
}
Uso:-
fonte
Swift 4
Baseado em https://stackoverflow.com/a/32513578/5391914
fonte
A resposta mais completa. https://github.com/oney/UIView-Border
fonte
Extensão rápida 4 com largura e cor da borda. Funciona bem!
}
fonte
Swift 5.1. Use com duas extensões, o método return CALayer, para que você o reutilize para atualizar os quadros.
fonte
extensão UIView {
func addBottomLine (cor: UIColor, altura: CGFloat) {
}
}
fonte