CALayer: добавить границу только с одной стороны

Я могу добавить границу к CALayer следующим образом:

[webView.layer setBorderColor: [[UIColor colorWithRed:0.6 green:0.7 blue:0.2 alpha:1] CGColor]]; [webView.layer setBorderWidth: 2.75]; 

Но можно ли добавить границу только с одной стороны? Мне нужна только граница внизу. Или я могу достичь этого с помощью других свойств, например frame, bounds, mask, …?

введите описание изображения здесь

Спасибо за вашу помощь!


@ Control-V

  UIWebView *webView = [[UIWebView alloc] init]; CALayer *webViewLayer = webView.layer; // now you can do a lot of stuff like borders: [webViewLayer setBorderColor: [[UIColor greenColor] CGColor]]; [webViewLayer setBorderWidth: 2.75]; 

Взгляните на документацию CALayer: https://developer.apple.com/documentation/quartzcore/calayer

И посмотрите здесь: http://iosdevelopertips.com/cocoa/add-rounded-corners-and-border-to-uiwebview.html

Я сделал правильную границу, используя это:

 leftScrollView.clipsToBounds = YES; CALayer *rightBorder = [CALayer layer]; rightBorder.borderColor = [UIColor darkGrayColor].CGColor; rightBorder.borderWidth = 1; rightBorder.frame = CGRectMake(-1, -1, CGRectGetWidth(leftScrollView.frame), CGRectGetHeight(leftScrollView.frame)+2); [leftScrollView.layer addSublayer:rightBorder]; 

Самый простой способ – добавить subLayer, который будет рисовать селективные границы, но при выборе этого решения необходимо учитывать некоторые вещи, самые большие – убедиться, что пограничный subLayer всегда находится сверху, и что границы меняются, когда вы меняете кадр вашего слоя.

Я реализовал решение с открытым исходным кодом, которое заботится об этих проблемах, и позволяет объявлять селективные границы следующим образом:

 myView.borderDirection = AUIFlexibleBordersDirectionRight | AUIFlexibleBordersDirectionTop; 

Вы можете получить код и прочитать об этом еще немного.

Свойство border всегда добавляет границу на 4 стороны вашего вида. Вы можете сделать свой собственный метод рисования, чтобы нарисовать границу внизу вашего представления.

Но почему бы вам просто не добавить над своим UIWebView представление, чтобы оно выглядело как граница?

Вот быстрый эквивалент

 leftScrollView.clipsToBounds = true let rightBorder: CALayer = CALayer() rightBorder.borderColor = UIColor.darkGrayColor().CGColor rightBorder.borderWidth = 1 rightBorder.frame = CGRectMake(-1, -1, CGRectGetWidth(leftScrollView.frame), CGRectGetHeight(leftScrollView.frame)+2) leftScrollView.layer.addSublayer(rightBorder) 

Мое быстрое решение. Он включает в себя четыре разные функции, все расширения для UIView. Каждая функция добавляет другую границу.

 extension UIView { @discardableResult func addRightBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: self.frame.size.width-width, y: 0, width: width, height: self.frame.size.height) self.layer.addSublayer(layer) return self } @discardableResult func addLeftBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: 0, y: 0, width: width, height: self.frame.size.height) self.layer.addSublayer(layer) return self } @discardableResult func addTopBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: width) self.layer.addSublayer(layer) return self } @discardableResult func addBottomBorder(color: UIColor, width: CGFloat) -> UIView { let layer = CALayer() layer.borderColor = color.cgColor layer.borderWidth = width layer.frame = CGRect(x: 0, y: self.frame.size.height-width, width: self.frame.size.width, height: width) self.layer.addSublayer(layer) return self } } 

Есть еще один способ сделать это. CAShapeLayer имеет свойства, называемые « strokeStart » и « strokeEnd ». Учитывая, что поглаживание начинается с 0 и заканчивается на 1, когда оно достигает начала координат, таким образом, завершая путь, вы можете установить значения для начала и конца для рисования границы с одной стороны.

Относительное местоположение, с которого нужно начинать гладить путь. Animatable. Значение этого свойства должно быть в диапазоне от 0.0 до 1.0. Значение по умолчанию этого значения равно 0.0. В сочетании с свойством strokeEnd это свойство определяет субрегион пути к штриху. Значение в этом свойстве указывает относительную точку вдоль пути, по которой нужно начать глажение, в то время как свойство strokeEnd определяет конечную точку. Значение 0.0 представляет начало пути, а значение 1.0 представляет собой конец пути. Значения между ними интерпретируются линейно вдоль длины пути.

Пример:

 let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.CGPath mask.strokeColor = UIColor.redColor().CGColor mask.strokeStart = 0.45 mask.strokeEnd = 0.92 self.layer.mask = mask 
  • Как сделать ui отзывчивым все время и делать обновление фона?
  • Изменить цвет курсора в UITextField
  • Обнаружение iPhone / iPod Touch
  • Есть ли способ указать позицию / индекс аргумента в NSString stringWithFormat?
  • Регулировка громкости проигрывателя AVPlayer
  • Как я могу заставить UITextField двигаться вверх, когда клавиатура присутствует?
  • Как программно предотвратить переключение Mac на hibernate?
  • Изменение позиции UIBarButtonItem в UINavigationBar
  • Типы в объективе-c на iPhone
  • Почему UINavigationBar крадет события касания?
  • Как распечатать имя метода и номер строки и условно отключить NSLog?
  • Давайте будем гением компьютера.