2016-07-12 6 views
3

Was ist der beste Weg, um einen unteren Rand zu einem TextView hinzufügen? Ich habe das versucht, aber es scheint, dass es nicht funktioniert. Es wird durch das Scrollen Fähigkeit des textview und die Linie wird gezogen in der Mitte des TextViewHinzufügen von unteren Rand zu einem 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 
} 

bearbeiten betroffen: Die Textview verfügt über eine dynamische Höhe.

Antwort

2

Update:

dachte ich viel über meine ursprüngliche Lösung.

Wenn Sie UITextView unterklassifizieren, um eine untere Zeile hinzuzufügen, dann sollte die untere Zeile besser eine Unteransicht der Textansicht selbst sein, als ihre Superansicht.

Und schließlich, finde ich eine Lösung, die als eine Unteransicht von TextView sich die untere Zeile hinzufügen kann und die untere Zeile wird nicht bewegt, wenn der Benutzer den Text von TextView scrollt. In Ihrer Ansicht Controller, können Sie auch den Rahmen von TextView dynamisch ändern, und die untere Zeile wird auch auf der Unterseite bleiben. Hier

ist der Referenzcode:

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

Hinweis: Da ich verwendete Code in Objective-C zu schreiben, ich bin nicht vertraut mit Swift. Der obige Code ist nur für Ihre Referenz (obwohl ich den entsprechenden Objective-C-Code getestet habe, und es funktioniert wie erwartet):

  • Wie Sie sehen können, gibt es keine Initialisierung Code. Ich habe versucht, solchen Code zu schreiben, aber es zeigt immer einen Fehler und ich habe immer noch keine Ahnung davon. So stellen Sie sicher, dass die folgenden Code in Ihre TextView Initialisierung Code hinzuzufügen:

    border = UIView() 
    addSubview(border) 
    originalInsetBottom = textContainerInset.bottom 
    addObserver(self, forKeyPath: "contentOffset", options: .New, context: nil) 
    
  • Ich bin nicht mit dem Konzept der optionalen Wert vertraut, wickeln, auspacken ... Also sollten Sie ?, ! auf den Code hinzufügen, wenn erforderlich.

Ursprüngliche Antwort:

Hat self in Ihrem Code bedeuten TextView?

Wenn ja, wenn Sie border als Unterschicht des TextView hinzufügen, die border verschiebt sich nach oben und nach unten, wenn der Benutzer scrollt der Text von TextView.

Versuchen Sie border als Sublayer von TextView 's Super View statt TextView selbst hinzuzufügen.Hier

ist der Code (Beachten Sie, dass ich border von CALayer zu UIView aus):

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

Hier ist die Erfassung:

enter image description here

PS. Ich empfehle Ihnen, den Namen des zweiten Parameters von Breite zu Höhe zu ändern, da die Breite in diesem Kontext mehrdeutig ist.

+0

Ihre Lösung ist perfekt, erwarten Sie für einen Fehler, ich habe eine dynamisch expandierende Textansicht, so dass jedes Mal, wenn die Textansicht erweitert oder schrumpft die Grenzposition verpasst und wird richtig positioniert, wenn ich erneut eintippe. Was könnte der Grund sein? –

+0

@AliAlebrahim Kannst du mehr über "dynamische Erweiterung" erzählen? Bedeutet das, dass du die frame.height von 'TextView' änderst? – CokileCeoi

+0

ja die Höhe der Textansicht ändert sich während der Laufzeit. –

0

die Maske Grenzen setzen es falsch zu sein, dann zeigen nur die Grenzen der Zeile, die Sie anzeigen möchten ..

+0

diese Lösung immer noch nicht für mich arbeiten. –

+0

Fügen Sie die Zeile als Unteransicht zu Ihrem Superview hinzu –

-1

Manchmal ist es einfacher, nur die Dinge ein wenig mehr unabhängig voneinander.

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

Diese Frage wurde markiert "swift". Ihre Lösung hat möglicherweise einen Wert, ist aber nicht in der von OP angeforderten Sprache verfasst. Bitte geben Sie eine Antwort in Swift. Vielen Dank. – Moritz

0

Versuchen folgender Code kann es hilft Sie

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

Es funktioniert besser mit folgenden Zeile:
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) 
    } 
} 
Verwandte Themen