2016-07-12 2 views
3

Что такое лучший способ добавить границу нижней границы в TextView? Я пробовал это, но кажется, что он не работает. Это зависит от прокрутки способностью textview и линия втягиваются в середине TextViewДобавление границы нижней границы в TextView - iOS

func addBottomBorderWithColor(color: UIColor, width: CGFloat) { 
     let border = CALayer() 
     border.backgroundColor = color.CGColor 
     border.frame = CGRectMake(0, self.frame.size.height - width, self.frame.size.width, width) 
     self.layer.addSublayer(border) 
     self.layer.masksToBounds = true 
} 

Edit: TextView имеет динамическую высоту.

ответ

2

Update:

Я много думал о своем первоначальном решении.

Если вы являетесь подклассом UITextView, чтобы добавить нижнюю строку, то нижняя строка лучше должна быть подсмотром самого текстового представления, а не его супер-представления.

И, наконец, я выясню одно решение, которое может добавить нижнюю строку в качестве поднабора TextView, а нижняя строка не будет перемещаться, когда пользователь прокручивает текст TextView. В вашем контроллере просмотра вы также можете динамически изменять рамку TextView, а нижняя строка также будет придерживаться нижней.

Вот код ссылки:

import UIKit 

class TextView: UITextView { 

    var border: UIView 
    var originalBorderFrame: CGRect 
    var originalInsetBottom: CGFloat 

    deinit { 
     removeObserver(self, forKeyPath: "contentOffset") 
    } 

    override var frame: CGRect { 
     didSet { 
      border.frame = CGRectMake(0, frame.height+contentOffset.y-border.frame.height, frame.width, border.frame.height) 
      originalBorderFrame = CGRectMake(0, frame.height-border.frame.height, frame.width, border.frame.height); 
     } 
    } 

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
     if keyPath == "contentOffset" { 
      border.frame = CGRectOffset(originalBorderFrame, 0, contentOffset.y) 
     } 
    } 

    func addBottomBorderWithColor(color: UIColor, width: CGFloat) { 
     border.backgroundColor = color 
     border.frame = CGRectMake(0, frame.height+contentOffset.y-width, self.frame.width, width) 
     originalBorderFrame = CGRectMake(0, frame.height-width, self.frame.width, width) 
     textContainerInset.bottom = originalInsetBottom+width 
    } 
} 

Примечание: Поскольку я использовал для написания кода в Objective-C, я не знаком с Swift. Код выше только для справки (хотя я проверил соответствующий код Objective-C, и она работает, как ожидалось):

  • Как вы можете видеть, нет код инициализации. Я пытался написать такой код, но он всегда показывает ошибку, и я до сих пор не знаю об этом. Просто убедитесь, чтобы добавить следующий код в код TextView инициализации:

    border = UIView() 
    addSubview(border) 
    originalInsetBottom = textContainerInset.bottom 
    addObserver(self, forKeyPath: "contentOffset", options: .New, context: nil) 
    
  • Я не знаком с понятием факультативного значения, обручем, разворачивать ... Таким образом, вы должны добавить ?, ! к коду, если необходимо.

Оригинальный ответ:

self в коде Означает ли TextView?

Если да, то когда вы добавляете border как подслой TextView, то border будет двигаться вверх и вниз, когда пользователь прокручивает текст TextView.

Попытайтесь добавить border в качестве подслоя с супер взглядом TextView, а не TextView.

Вот код (Обратите внимание, что я изменяю border от CALayer к UIView):

func addBottomBorderWithColor(color: UIColor, width: CGFloat) { 
    let border = UIView() 
    border.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y+self.frame.height-width, textView.frame.width, width) 
    border.backgroundColor = color 
    self.superview!.insertSubview(border, aboveSubview: textView) 
} 

Вот захват:

enter image description here

PS. Я предлагаю вам изменить второе имя параметра от ширины до высоты, поскольку в этом контексте ширина неоднозначна.

+0

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

+0

@AliAlebrahim Можете ли вы рассказать о «динамическом расширении»? Означает ли это, что вы измените frame.height 'TextView'? – CokileCeoi

+0

да высота изменения текста во время выполнения. –

0

Установите маску рамки, чтобы быть ложным, тогда только она показывает границы линии, которую вы хотите показать ..

+0

это решение до сих пор не работает для меня. –

+0

добавьте строку в качестве подсмотра в ваш супервизор –

-1

Иногда бывает проще просто держать вещи немного более независимыми друг от друга.

UIImageView * border = [UIImageView new]; 
border.frame = CGRectMake(0,y,100,0.5f); 
border.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3f]; 
[self.view addSubview:border]; 
+0

Этот вопрос отмечен как «swift». Ваше решение может иметь ценность, но не написано на языке, запрошенном OP, поэтому он не по теме. Пожалуйста, укажите ответ в Swift. Спасибо. – Moritz

0

Попробуйте следующий код он может поможет вам

func addBottomBorderWithColor(color: UIColor, width: CGFloat) { 
    let border = CALayer() 
    border.backgroundColor = color.CGColor 
    border.frame = CGRectMake(0, yourTextview.frame.origin.y+yourTextview.frame.size.height+1 , width, 1) 
    self.view.layer.addSublayer(border) 
    self.view.layer.masksToBounds = true 
} 
0

Он работает лучше с следующей строки:
border.autoresizingMask = [.flexibleWidth, .flexibleHeight]

extension UITextView { 
    func addBottomBorderWithColor(color: UIColor, height: CGFloat) { 
     let border = UIView() 
     border.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
     border.frame = CGRect(self.frame.origin.x,  
     self.frame.origin.y+self.frame.height-height, self.frame.width, height) 
     border.backgroundColor = color 
     self.superview!.insertSubview(border, aboveSubview: self) 
    } 
} 
Смежные вопросы