К UIScrollView *toScrollView
(ширине экрана) я хочу добавить серую нижнюю границу (точно так же, как в поле «to» поля представления compose приложения «Сообщения» iPhone).
Для достижения этой цели, я последовал Cocoa Touch: Как изменить UIView граничащих цветов и толщины? и просто накрыл верхнюю границу с помощью обычая UINavigationBar
и сделал toScrollView
координату х -1 и ширину 322, чтобы левая и правая границы были вне экрана.
Это выглядит хорошо, но это своего рода хак, и мне было интересно, есть ли лучший способ сделать это.
- (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
}
Ответы:
Вместо использования
UIView
, как предлагает @ ImreKelényi, вы можете использоватьCALayer
:источник
QuartzCore framework
ваш проект, если у вас его нет, так как вы можете получить ошибки компилятора.QuartzCore.framework
больше добавлять .43.0f
его,toScrollView.frame.size.height
чтобы убедиться, что он внизуВот более обобщенное расширение Swift для создания границы для любого
UIView
подкласса:Swift 3
источник
border.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: width)
и т. д.Реализовано в категории, как показано ниже:
UIButton + Border.h:
UIButton + Border.m:
источник
Swift 4
Если вам нужно действительно адаптивное решение (для всех размеров экрана), то вот оно:
источник
Вы можете добавить отдельное изображение
UIView
с высотой 1 точки и серым цветом фонаself.view
и расположить его прямо под нимtoScrollView
.источник
Решение для Swift 4
BackgroundColor lightGray. Измените цвет, если вам нужно.
источник
Также улучшен код с функцией удаления границы. На основании конфиденциального ответа .
Обновление: Swift 3
источник
func remove(border: ViewBorder) { layer.sublayers? .compactMap { $0 } .filter { $0.name == border.rawValue } .forEach { $0.removeFromSuperlayer() } }
Проблема с этими методами расширения заключается в том, что когда UIView / UIButton позже настраивает его размер, у вас нет шансов изменить размер CALayer для соответствия новому размеру. Который оставит вас с неуместной границей. Я обнаружил, что было бы лучше создать подкласс моего UIButton, вы, конечно, могли бы также создать подкласс других UIViews. Вот некоторый код:
источник
Или самый удобный для производительности способ - перегрузить drawRect, просто так:
источник
drawRect:
не обязательно для производительности. Я уверен, что использование слоя имеет гораздо лучшую производительность.setFrame:
,setBounds:
илиlayoutSubviews
методов.layoutSublayersOfLayer:
вместоsetFrame:
или любой другойSwift 3 версия ответа Confile:
Использование при использовании автоматического макета:
источник
Если вы используете ограничения (и поэтому не имеете размеров кадра), тогда вы можете добавить представление границы с необходимыми ограничениями
Затем установите что-то вроде ниже
(вдохновленный этим ответом )
источник
стриж
Создать расширение UIView
Цель С
Создать категорию класса UIView
UIView + Border.h
UIView + Border.m
Использование: - Выберите любой элемент управления из раскадровки, затем покажите инспектор атрибутов (справа). Вы увидите пример изображения ниже (Примечание: границы появляются только во время выполнения).
Теперь Вы можете установить любую сторону цвета и ширины границы.
источник
Я написал общий метод, который добавит границу с любой стороны, которую вы пожелаете
UIView
. Вы можете определить толщину, цвет, поля иzOrder
для каждой стороны.источник
Вам не нужно добавлять слой для каждой границы, просто используйте безье, чтобы нарисовать их один раз.
источник
Свифт 4/3
Вы можете использовать это решение ниже. Он работает на UIBezierPaths, которые легче, чем слои, вызывая быстрое время запуска. Он прост в использовании, см. Инструкции ниже.
источник
Swift 4
На основании: https://stackoverflow.com/a/32821607/9980800
UIView + Border
}
Использование:-
источник
Swift 4
Основано на https://stackoverflow.com/a/32513578/5391914
источник
Самый полный ответ. https://github.com/oney/UIView-Border
источник
Удлинитель Swift 4 с шириной и цветом рамки. Прекрасно работает!
}
источник
Свифт 5.1. Используйте с двумя расширениями метод return CALayer, чтобы вы могли использовать его для обновления фреймов.
источник
расширение UIView {
func addBottomLine (цвет: UIColor, высота: CGFloat) {
}
}
источник