UITextView starts at Bottom or Middle of the text
That did the trick for me!
Objective C:
[self.textView scrollRangeToVisible:NSMakeRange(0, 0)];
Swift:
self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
Swift 2 (Alternate Solution)
Add this override method to your ViewController
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.setContentOffset(CGPointZero, animated: false)
}
Swift 3 & 4 (syntax edit)
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.contentOffset = .zero
}
UITextView text starts from the middle and not the top
In the ViewController containing the UITextField, add this:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
textView.setContentOffset(CGPoint.zero, animated: false)
}
UITextView always appears scrolled to bottom of content?
Try following, may it help:
[yourTextView scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES];
OR
set the content offset in viewDidLayoutSubviews
for it to take effect.
- (void)viewDidLayoutSubviews {
[yourTextView setContentOffset:CGPointZero animated:NO];
}
OR
in viewDidLoad
[yourTextView scrollRangeToVisible:NSMakeRange(0, 1)];
UITextView alignment to bottom
I don't believe there is a built-in way to vertically align the text in a UITextView
, but you should be able to use the contentOffset
property of the UITextView
class to accomplish this. See this blog post for more details:
http://imagineric.ericd.net/2011/03/10/ios-vertical-aligning-text-in-a-uitextview/
Update: since the above link appears to be dead, I used the Wayback Machine to retrieve an archived copy and have pasted the text of the article below.
The default and expected behavior of a UITextView (multi-line text) out of the box in iOS is to align the text top left in it’s container. That works well most of the time. However I recently had need to either center the text vertically within the control or have all the text align to the bottom of the control.
You can add an observer to the control and when it’s content size changes (text is set), fire a method. The method can then handle how the text is actually positioned in the control. If it doesn’t make sense to do the alignment, it will default to the normal behavior of the control (top vertical alignment).
Here we go:
- (void) viewDidLoad {
[textField addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL];
[super viewDidLoad];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
UITextView *tv = object;
//Center vertical alignment
//CGFloat topCorrect = ([tv bounds].size.height - [tv contentSize].height * [tv zoomScale])/2.0;
//topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
//tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
//Bottom vertical alignment
CGFloat topCorrect = ([tv bounds].size.height - [tv contentSize].height);
topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect);
tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
}
You can decide which you’d like to use, or flush the method out to take an argument for which type of vertical alignment you’d like to use. This works quite well and it would have been nice if the properties were built into the control to begin with.
If you can use it, enjoy.
Text line in UITextView is cut the middle
Well, I ended up deleting the VC and creating it all over again. I also used the same VC class. Now it seems to be working.
Text in Textfield starts in Middle of TextField IOS
What you want to do is both a horizontal
and vertical
alignment like this:
textField.textAlignment = .left
textField.contentVerticalAlignment = .top
Result:
UITextView text not starting from top
Set the Content Inset like this in your UITextView
youtextView.contentInset = UIEdgeInsetsMake(-7.0,0.0,0,0.0);
Adjust the Top value the way you want. this shoud fix your problem.
EDIT:
If you're having issues with iOS7 or above, try using...
[yourTextView setContentOffset: CGPointMake(x,y) animated:BOOL];
My UITextView text jumps to right after editing (swift)
You need to use Text Alignment. From the documentation:
var textAlignment: NSTextAlignment
You may have to hard-set the UITextView typing attributes.
Then again, if your problem is not that it stops being text-aligned to the left but rather that the whole thing becomes slightly indented, your issue may be with Text Container Inset. You can read more about the inset here.
textView.textContainerInset = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8);
How to lose margin/padding in UITextView
Up-to-date for 2021
It is one of the silliest bugs in iOS.
The class given here, UITextViewFixed
, is used widely, and is usually the most reasonable solution overall.
Here is the class:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
}
}
Don't forget to turn off scrollEnabled in the Inspector!
The solution works properly in storyboard
The solution works properly at runtime
That's it, you're done.
In general, that should be all you need in most cases.
Even if you are changing the height of the text view on the fly, UITextViewFixed
usually does all you need.
(A common example of changing the height on the fly, is changing it as the user types.)
Here is the broken UITextView from Apple...
Here is UITextViewFixed
:
Note that of course you must...
...turn off scrollEnabled in the Inspector!
(Turning on scrollEnabled means "make this view expand as much as possible vertically by expanding the bottom margin as much as possible.")
Some further issues
(1) In some very unusual cases dynamically changing heights, Apple does a bizarre thing: they add extra space at the bottom.
No, really! This would have to be one of the most infuriating things in iOS.
If you encounter the problem, here is a "quick fix" which usually helps:
...
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
// this is not ideal, but sometimes this "quick fix"
// will solve the "extra space at the bottom" insanity:
var b = bounds
let h = sizeThatFits(CGSize(
width: bounds.size.width,
height: CGFloat.greatestFiniteMagnitude)
).height
b.size.height = h
bounds = b
...
(2) In rare cases, to fix yet another subtle mess-up by Apple, you have to add:
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false) // sic
}
(3) Arguably, we should be adding:
contentInset = UIEdgeInsets.zero
just after .lineFragmentPadding = 0
in UITextViewFixed
.
However ... believe or not ... that just doesn't work in current iOS! (Checked 2021.) It may be necessary to add that line in the future.
The fact that UITextView
is broken in iOS is one of the weirdest things in all of mobile computing. Ten year anniversary of this question and it's still not fixed!
Finally, here's a somewhat similar tip for TextField: Set the maximum character length of a UITextField in Swift
Completely random tip: how to add the "..." on the end
Often you are using a UITextView "like a UILabel". So you want it to truncate text using an ellipsis, "..."
If so, add:
textContainer.lineBreakMode = .byTruncatingTail
Handy tip if you want zero height, when, there's no text at all
Often you use a text view to only display text. So, you use lines "0" to mean the text view will automatically change height depending on how many lines of text.
That's great. But if there is no text at all, then unfortunately you get the same height as if there is one line of text!!!! The text view never "goes away".
If you want it to "go away", just add this
override var intrinsicContentSize: CGSize {
var i = super.intrinsicContentSize
print("for \(text) size will be \(i)")
if text == "" { i.height = 1.0 }
print(" but we changed it to \(i)")
return i
}
(I made it '1' height, so it's clear what's going on in that demo, '0' is fine.)
What about UILabel?
When just displaying text, UILabel has many advantages over UITextView. UILabel does not suffer from the problems described on this Q&A page.
Indeed the reason we all usually "give up" and just use UITextView is that UILabel is difficult to work with. In particular it is ridiculously difficult to just add padding, correctly, to UILabel.
In fact here is a full discussion on how to "finally" correctly add padding to UILabel: Adding space/padding to a UILabel. In some cases if you are doing a difficult layout with dynamic height cells, it is sometimes better to do it the hard way with UILabel.
Related Topics
Uicollectionview Sticky Header in Swift
How to Add a Toolbar to the Bottom of a Uitableviewcontroller in Storyboards
Tableview Reloaddata VS. Beginupdates & Endupdates
What's Always_Embed_Swift_Standard_Libraries with Cocoapods, Swift 3 and Xcode 8
Request Permissions Again After User Denies Location Services
Allowing Single Digit in Uitextfield in iOS
Memory Leak with Large Core Data Batch Insert in Swift
Getting Url of Uiimage Selected from Uiimagepickercontroller
Uicollectionview Scrolling Choppy When Loading Cells
Uiviewcontrollerhierarchyinconsistency When Trying to Present a Modal View Controller
Auto Layout Constraint on Calayer iOS
Nsurlsession "Http Load Failed Kcfstreamerrordomainssl, -9813 ; Self Signing Certificate
How to Share Image in Instagramswift
Why Does Safari Mobile Have Trouble Handling Many Input Fields on iOS 8