Change UILabel text in UIScrollView - ios5

I'm trying to make an app in which there's a scrollview with frame and content size set from storyboard. i have inserted a label and both scrollview and uilabel have iboutlet created.
i want to change text of uilabel each time i scroll with paging. content is saved in a nsmutable array as string. there's only single uilabel, and i wanna reuse it with content from array in every page of scroll view. please help..

I think you need to use one of the method of UIScrollViewDelegate like scrollViewDidEndDecelerating: in this you can change the text of label and also the frame of the label to show it in visible rect of scrollview
- (void)scrollViewDidEndDecelerating:(UIScrollView *)ascrollView
{
if(lastContentOffset < ascrollView.contentOffset.x)
{
if(index-2 >= 0)
{
[ascrollView addSubview:[thumbs objectAtIndex:index-2]];
index-=1;
//change label text using the index and also it's frame's origin.x
NSLog(#"Direction Right Index %d",index);
}
}
else if(lastContentOffset > ascrollView.contentOffset.x)
{
if(index+2 < [thumbs count])
{
[ascrollView addSubview:[thumbs objectAtIndex:index+2]];
index+=1;
//change label text using the index and also it's frame's origin.x
NSLog(#"Direction Left Index %d",index);
}
}
NSLog(#"ScrollViewDidScroll is called");
lastContentOffset = ascrollView.contentOffset.x;
}
here the lastContentOffset is float variable which holds the current visible frame's x of the scrollview
in .m file declare two ivars below all the #synthesize as
NSMutableArray *arr; & float lastContentOffset;
then when you fill your scrollView just assign it's frame's origin.x to the lastContentOffset and then use the arr to change the text of label

Related

UIScrollView Resizable?

I have a UIScrollView and I take a UIImageView and an UITextView that scrolls vertically.
The scrollview is 320*700. I want to do the scroll size depend upon the UITextView size, The image is same size but the text changes depend on the content.
How can I setup the scrollview's size to change only when I've got more or less text in the UITextView?
You can set your UIScrollView's size dynamically according to the size of your UITextViewusing something like
- (void)viewDidLoad
{
float sizeOfContent = 0;
UIView *lLast = [scrollView.subviews lastObject];
NSInteger wd = lLast.frame.origin.y;
NSInteger ht = lLast.frame.size.height;
sizeOfContent = wd+ht;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, sizeOfContent);
}
Please also refer to How to set content size of UIScrollView dynamically to be able to understand better .

How do you vertically center a table view that has a variable number of rows?

I have a UITableView with a variable number of rows, rather than being a static height.
How can I vertically center this variable-height table view within a UIView?
One cheap and easy way to vertically center text in table view cells is
you could subclass NSTextFieldCell, and for each table column set it to
use the subclass cell. In the subclass, intercepting the rectangle
into which it draws the cell contents is a simple matter: override the
drawInteriorWithFrame method, making some adjustments to the frame,
then call the super method.
- (void)drawInteriorWithFrame:(NSRect)cellFrame
inView:(NSView *)controlView {
// Adjust the cell frame rect so it appears vertically centered.
NSSize contentSize = [self cellSize];
cellFrame.origin.y += (cellFrame.size.height - contentSize.height)
/ 2.0f;
cellFrame.size.height = contentSize.height;
// Do whatever it is it does...
[super drawInteriorWithFrame:cellFrame inView:controlView];
}

Uitextview scroll view position

I am trying to implement UITextView in my iphone app. UITextView's content increases dyamically.
At same time I want to move scroll position also.
I am trying to scrollToVisibleRect method, but not getting any success.
Thanks
If I understand your question properly then you want to scroll your text view at the bottom of text. To do so try this :
- (void) goToBottom
{
NSUInteger length = self.myTextView.text.length;
self.myTextView.selectedRange = NSMakeRange(length, 0);
[myTextView setContentOffset:CGPointMake(length, 0) animated:YES];
}

Change image or style of specific UITableViewCell

Is there any way that I can get a specific cell to change its style or background image while scrolling the table view?
I want to change the image of a cell which is on top of the visible cells. But only its image is going to be changed the others will stay same, until after scrolling the others come to top of the cells which are shown on the screen. Then the top one's image is going to change this time.
You need to implement scrollViewDidScroll: method of UIScrollViewDelegate in your controller then use visibleCells property of UITableView to get the visible cells of the table.
Something like the following code should work
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
UITableView* tableView;
NSArray* visibleCells;
BOOL first;
tableView = (UITableView*)scrollView;
visibleCells = tableView.visibleCells;
first = YES;
for (UITableViewCell* cell in visibleCells) {
if (first) {
//customize the top cell
first = NO;
}else {
//customize the other visible cells
}
}
}

Calculate the contentsize of scrollview

I'm having a scrollview as the detailedview of tableview cell. There are multiple views on the detailedview like labels, buttons etc. which I'm creating through interface builder. What I'm creating through interface builder is static. I'm putting everything on a view of height 480.
A label on my detailedview is having dynamic text which can extend to any length. The problem is that I need to set the scrollview's content size for which I need its height.
How shall I set scrollview's height provided the content is dynamic?
You could try to use the scrollview'ers ContentSize. It worked for me and I had the same problem with the control using dynamic content.
// Calculate scroll view size
float sizeOfContent = 0;
int i;
for (i = 0; i < [myScrollView.subviews count]; i++) {
UIView *view =[myScrollView.subviews objectAtIndex:i];
sizeOfContent += view.frame.size.height;
}
// Set content size for scroll view
myScrollView.contentSize = CGSizeMake(myScrollView.frame.size.width, sizeOfContent);
I do this in the method called viewWillAppear in the controller for the view that holds the scrollview. It is the last thing i do before calling the viewDidLoad on the super.
Hope it will solve your problem.
//hannes
Correct shorter example:
float hgt=0; for (UIView *view in scrollView1.subviews) hgt+=view.frame.size.height;
[scrollView1 setContentSize:CGSizeMake(scrollView1.frame.size.width,hgt)];
Note that this only sums heights, e.g. if there are two subviews side by side their heights with both be added, making the sum greater than it should be. Also, if there are vertical gaps between the subviews, the sum will be less than it should be. Wrong height confuses scrollRectToVisible, giving random scroll positions :)
This loop is working and tested:
float thisy,maxy=0;for (UIView *view in scrollView1.subviews) {
thisy=view.frame.origin.y+view.frame.size.height; maxy=(thisy>maxy) ? thisy : maxy;
}
A somewhat easier way to do this is to nest your layout within a view then put that view within the scrollview. Assuming you use tags, this works as follows:
UIScrollView *scrollview = (UIScrollView *)[self.view viewWithTag:1];
UIView *longView = (UIView *)[self.view viewWithTag:2];
scrollview.contentSize = CGSizeMake(scrollView.frame.size.width, longView.frame.size.height);
That way the longView knows how tall it is, and the scrollview's content is just set to match.
This depends on the type of content you are going to add dynamically. So let's say you have a big text data to show, then use the UITextView and as it is a subclass of the UIScrollView, you can get the setContentSize of TextView when you assign the text content. Based on that you can set the total size of the UIScrollView.
float yPoint = 0.0f;
UIScrollView *myScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0f, yPoint, 320.0f, 400.0f)];
UITextView *calculatorTextView = [[UITextView alloc] init]; calculatorTextView.text = #"My looong content text ..... this has a dynamic content"; `
[calculatorTextView sizeToFit];
yPoint = yPoint + calculatorTextView.contentSize.height; // Bingo, we have the new yPoint now to start the next component.
// Now you know the height of your text and where it will end. So you can create a Label or another TextView and display your text there. You can add those components as subview to the scrollview.
UITextView *myDisplayContent = [[UITextView alloc] initWithFrame:CGRectMake(0.0f, yPoint, 300.f, calculatorTextView.contentSize.height)];
myDisplayContent.text = #"My lengthy text ....";
[myScrollView addSubview:myDisplayContent];
// At the end, set the content size of the 'myScrollView' to the total length of the display area.
[myScrollView setContentSize:yPoint + heightOfLastComponent];
This works for me.
I guess there's no auto in case of scrollview, and the contentsize should be calculated for static views on the screen at least and for dynamic once it should be calculated on the go.
scrollView.contentSize = [scrollView sizeThatFits:scrollView.frame.size]
I believe would also work
I had the same situation, but then I wrote a new version in Swift 4 mirroring the better answer in Objective-C by Hannes Larsson:
import UIKit
extension UIScrollView {
func fitSizeOfContent() {
let sumHeight = self.subviews.map({$0.frame.size.height}).reduce(0, {x, y in x + y})
self.contentSize = CGSize(width: self.frame.width, height: sumHeight)
}
}