向TextView添加底线边框- iOS

eimct9ow  于 2023-01-06  发布在  iOS
关注(0)|答案(7)|浏览(140)

向具有动态高度的TextView添加底线边框的最佳方法是什么?
我试过这个:

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
}
a6b3iqyw

a6b3iqyw1#

Swift 4版本

func addBottomBorderWithColor() {
    let border = CALayer()
    border.backgroundColor = UIColor.black.cgColor
    border.frame = CGRect(x: 0, y: yourTextArea.frame.height - 1, width: yourTextArea.frame.width, height: 1)
    yourTextArea.layer.addSublayer(border)
    self.view.layer.masksToBounds = true
}
jxct1oxe

jxct1oxe2#

    • 更新日期:**

我想了很多关于我最初的解决方案。
如果你要子类化UITextView来添加一个底线,那么底线最好是文本视图本身的子视图,而不是它的超级视图的子视图。
最后,我提出了一个解决方案,可以将bottom line作为TextView本身的子视图添加,并且当用户滚动TextView的文本时,bottom line不会移动。在视图控制器中,您还可以动态地改变TextView的框架,并且bottom line也会粘在底部。
下面是参考代码:

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)
  • 我不熟悉可选值、wrap、unwrap ......的概念,所以如果需要的话,应该在代码中添加?!
    • 原答复:**

代码中的self是否表示TextView
如果是这样,当您添加border作为TextView的子层时,当用户滚动TextView的文本时,border将上下移动。
尝试添加border作为TextView的超级视图的子层,而不是TextView本身。
下面是代码(注意,我将borderCALayer更改为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)
 }

下面是捕获:

我建议你把第二个参数名从width改为height,因为width在这里是不明确的。

bpzcxfmw

bpzcxfmw3#

使用以下行效果更好:
边框.自动调整大小蒙版= [.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)
    }
}
wkyowqbh

wkyowqbh4#

我尝试过其他的答案,它们要么很难实现,要么有bug,但是,我发现了一个简单,也许是最好的方法来实现这一点:
只需在UITextView旁边添加一个UIView,高度为1(也可以选择2),设置约束,确保UIViewUITextView之上。
所有这些都可以在情节串连图板中实现,因此我在这里不提供代码,因为这个UIView可以替换为UIImageView,如果愿意,您可以向您的UITextView添加mustache
:)

hmmo2u0o

hmmo2u0o5#

将bounds的掩码设置为false,则仅显示要显示的行的边界。

58wvjzkj

58wvjzkj6#

尝试以下代码,它可能会帮助您

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
}
qnzebej0

qnzebej07#

有时候让事情彼此独立一点会更容易。

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

相关问题