Fred
Fred

Reputation: 111

How to get a title to scroll above an iOS text view

I want to have a text title scroll above a text view, but can't find information on how to do it. I've been looking for days, but can't even figure out how to look for the info. I want the function to work like the Apple Notes app where the date text is positioned above the text entry location and scrolls off the screen with the text but is not editable.

I've tried placing labels above UITextView, but the label does not scroll with the textView. I have a sample Xcode project I'm work with, but not sure if it can be uploaded for others to see what I'm doing. I almost had success with the project, but the labels only scroll with the text in the landscape view, not the portrait view for some reason.

I've read Apple developer docs on TextViews and several other sources without finding any discussion on how to do this or examples to follow.

Can anyone point me in the right direction?

Upvotes: 0

Views: 1424

Answers (2)

Fred
Fred

Reputation: 111

I'm sure there must be a better way to do this, but this is the only approach I've found to work after more than a week of trying to find a solution. If I can figure out how to upload the entire Xcode example project I will do that.

This is the explanation of the approach I found to work under iOS 6.1 and Xcode 4.5. I have only tired this on the iPhone 6.1 simulator.

After creating a full screen text view and placing a label at the top of the text view, To get the label to scroll off screen with the editable text view you need to:

  1. turn off autolayout in interface builder (uncheck Use Autolayout). (there appears to be a problem with autoLayout and scrollViews in iOS 6.x)
  2. turn off the text view scrolling in interface builder (uncheck Scrolling Enabled)
  3. set the text view content insets height (Top) to the label height
  4. embed the text view and label in a scroll view.
  5. set properties for the scroll view and text view to be able to access their properties
  6. in viewDidAppear:animated: a. set the scroll view content size height to 20 plus the greater of the screen view height or the text view content height plus the label height b. set the text view delegate to self

    -(void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
    
        float screenHeight = self.view.bounds.size.height;
    
        // set the scroll view content height to 20 plus the greater of the view height or the text view content size height plus the label height
    
        screenHeight = MAX(screenHeight, self.textView.contentSize.height + 20);
        self.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width, 20 + screenHeight);
    
        // set the text view delegate
        self.textView.delegate = self;
    }
    
  7. set the text view height dynamically in textView delegate method textViewDidChange: a. if the text view content height is greater than the view bounds height less the label height: 1. set the text view frame to the view bounds width and the text view content height plus the lable height 2. set the scroll view content height to the view bounds width and the text view bounds height plus the label height

    // dynamically set the text view content size height
    -(void) textViewDidChange:(UITextView *)textView {
    
        if (self.textView.contentSize.height > self.view.bounds.size.height - 20) {
    
            self.textView.frame = CGRectMake(0.0, 0.0, self.view.bounds.size.width, self.textView.contentSize.height + 20);
    
            self.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width, self.textView.bounds.size.height + 20);
        }
    
    }
    

set the struts and springs in interface builder 1. set the scroll view and text view struts for left, right and bottom 2. set the scroll view and text view springs for width and height 3. set the label struts for left, right and top 4. set the label spring for width

The same settings need to be made every time the view changes orientations.

There might be a way to do this by setting constraints in code under autolayout, but I barely understand constraints, much less setting them successfully in code.

Hope this helps someone else.

Upvotes: 2

sangony
sangony

Reputation: 11696

What you are looking for is called UIScrollView. Take a look at the Apple documentation here.

A good tutorial on UIScrollView can be found on the Ray Wenderlich site.

Upvotes: 0

Related Questions