I have a large size image. To save the memory so I don't want to load the whole picture at one time, so I divide the image into 9 pictures like an 3X3 array
036
147
258
I can scroll the smaller image pieces from one image to an adjacent image, like from(1,1) to (1,2)(1,3), or from(1,1) to (2,1)(3,1), but I can't scroll it from (1,1) to (2,2) or(3,3).
It seems I can only scroll the pic up from side to side or up and down, but not diagonally.
If I scroll diagonally, then all image looks messed up, like this:
360
471
582
How can I scroll diagonally, and/or skip sections while scrolling?
Here is my code:
.h
CGPoint first;
IBOutlet UIScrollView *scr;
NSMutableArray *ary;
int x_total;
int y_total;
BOOL move;
BOOL inside;
IBOutlet UIView *mapview;
int x_begin;
int y_begin;
int x_times;
int y_times;
Cut images
move = NO;
inside = NO;
x_times = 0;
y_total = 0;
ary = [NSMutableArray new];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_%d_%d.jpg", i ,j]]];
[img setFrame:CGRectMake((i-1) *64, (j-1)*64, 64, 64)];
[mapview addSubview:img];
[ary addObject:img];
}
}
x_begin = 64*2;
y_begin = 64*2;
x_total = 0;
y_total = 0;
and the method to control finger touch and move
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"touchesBegan");
//Set Animation
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationBeginsFromCurrentState:YES];
//Trigger start
//UITouch *touch = [touches anyObject];
NSSet *teaches = [event allTouches];
for (UITouch *myTouch in teaches){
//first = [myTouch previousLocationInView:self.view];
CGPoint currentTouchPosition = [myTouch previousLocationInView:mapview];
//first = [myTouch previousLocationInView:mapview];
NSLog(@"currentTouchPosition x is %f",currentTouchPosition.x);
NSLog(@"currentTouchPosition y is %f",currentTouchPosition.y);
NSLog(@"mapview.frame.origin.x is %d",mapview.frame.origin.x);
NSLog(@"mapview.frame.origin.y is %d",mapview.frame.origin.y);
if ((currentTouchPosition.x > 0 && currentTouchPosition.x < 64) && (currentTouchPosition.y > 0 && currentTouchPosition.y < 64)) {
first = currentTouchPosition;
inside = YES;
}else {
first.x = 0;
first.y = 0;
inside = NO;
}
}
[UIView commitAnimations];
}
Touch Moved
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
//Touch Trigger
NSSet *teaches = [event allTouches];
for (UITouch *myTouch in teaches){
CGPoint currentTouchPosition = [myTouch previousLocationInView:mapview];
NSLog(@"currentTouchPosition.x is %d ",currentTouchPosition.x);
if (inside) {
if ((currentTouchPosition.x > 0 && currentTouchPosition.x < 64) && (currentTouchPosition.y > 0 && currentTouchPosition.y < 64)) {
int x = first.x-currentTouchPosition.x;
int y = first.y-currentTouchPosition.y;
x_total += x;
y_total += y;
NSLog(@"x_total is %d",x_total);
NSLog(@"y_total is %d",y_total);
NSArray *arr = [mapview subviews];
NSEnumerator *enumerator = [arr objectEnumerator];
id anObject;
UIImageView *tmpimg;
while (anObject = [enumerator nextObject]) {
if([anObject isMemberOfClass:[UIImageView class]]) {
tmpimg = (UIImageView *)anObject;
if (x < 0) {
[tmpimg setFrame:CGRectMake(tmpimg.frame.origin.x-x, tmpimg.frame.origin.y, tmpimg.frame.size.width, tmpimg.frame.size.height)];
}else {
[tmpimg setFrame:CGRectMake(tmpimg.frame.origin.x-x, tmpimg.frame.origin.y, tmpimg.frame.size.width, tmpimg.frame.size.height)];
}
if (y < 0) {
[tmpimg setFrame:CGRectMake(tmpimg.frame.origin.x, tmpimg.frame.origin.y-y, tmpimg.frame.size.width, tmpimg.frame.size.height)];
}else {
[tmpimg setFrame:CGRectMake(tmpimg.frame.origin.x, tmpimg.frame.origin.y-y, tmpimg.frame.size.width, tmpimg.frame.size.height)];
}
}
}
if (y_times == 0) {
if (y_total >= 64/2) {
y_times ++;
for (int i = 0; i < 3; i++) {
int g;
if (i == 0) {
g = 0;
}else if (i == 1) {
g = 3;
}else if (i == 2) {
g = 6;
}
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:g];
[[ary objectAtIndex:g] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_%d_3.jpg" ,i]]];
[[ary objectAtIndex:g] setFrame:CGRectMake(tmpimg.frame.origin.x, tmpimg.frame.origin.y+(64+64*2), 64, 64)];
tmpimg = nil;
}
y_total= 0;
}
if (x_times == 0) {
if (x_total >= 64/2) {
x_times ++;
for (int i = 0; i < 3; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_3_%d.jpg" ,i]]];
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x+(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}
}else if (x_times == 1) {
if (x_total >= 64) {
x_times ++;
for (int i = 3; i < 6; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_4_%d.jpg" ,i-3]]];
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x+(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}else if (x_total <= -64/2) {
x_times --;
for (int i = 0; i < 3; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_0_%d.jpg" ,i]]];
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x-(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}
}else if (x_times == 2) {
if (x_total >= 64) {
x_times ++;
for (int i = 6; i < 9; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_5_%d.jpg" ,i-6]]];
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x+(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}else if (x_total <= -64/2) {
x_times --;
for (int i = 3; i < 6; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_1_%d.jpg" ,i-3]]];
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x-(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}
}else if (x_times == 3) {
if (x_total <= -64/2) {
x_times --;
for (int i = 6; i < 9; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_2_%d.jpg" ,i-6]]];
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x-(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}
}
}
if (y_times == 1) {
if (y_total <= -64/2) {
y_times --;
for (int i = 0; i < 3; i++) {
int g;
if (i == 0) {
g = 0;
}else if (i == 1) {
g = 3;
}else if (i == 2) {
g = 6;
}
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:g];
[[ary objectAtIndex:g] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_%d_0.jpg" ,i]]];
[[ary objectAtIndex:g] setFrame:CGRectMake(tmpimg.frame.origin.x, tmpimg.frame.origin.y-(64+64*2), 64, 64)];
tmpimg = nil;
}
y_total= 0;
}
if (x_times == 0) {
if (x_total >= 64/2) {
x_times ++;
for (int i = 0; i < 3; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
if (i == 0) {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_3_%d.jpg" ,i+3]]];
}else {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_3_%d.jpg" ,i]]];
}
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x+(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}
}else if (x_times == 1) {
if (x_total >= 64) {
x_times ++;
for (int i = 3; i < 6; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
if (i == 3) {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_4_%d.jpg" ,i]]];
}else {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_4_%d.jpg" ,i-3]]];
}
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x+(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}else if (x_total <= -64/2) {
x_times --;
for (int i = 0; i < 3; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
if (i == 0) {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_0_%d.jpg" ,i+3]]];
}else {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_0_%d.jpg" ,i]]];
}
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x-(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}
}else if (x_times == 2) {
if (x_total >= 64) {
x_times ++;
for (int i = 6; i < 9; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
if (i == 3) {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_5_%d.jpg" ,i-3]]];
}else {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_5_%d.jpg" ,i-6]]];
}
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x+(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}else if (x_total <= -64/2) {
x_times --;
for (int i = 3; i < 6; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
if (i == 3) {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_1_%d.jpg" ,i]]];
}else {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_1_%d.jpg" ,i-3]]];
}
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x-(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}
}else if (x_times == 3) {
if (x_total <= -64/2) {
x_times --;
for (int i = 6; i < 9; i++) {
UIImageView *tmpimg;
tmpimg = [ary objectAtIndex:i];
if (i == 3) {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_2_%d.jpg" ,i-3]]];
}else {
[[ary objectAtIndex:i] setImage:[UIImage imageNamed:[NSString stringWithFormat:@"map14_2_%d.jpg" ,i-6]]];
}
[[ary objectAtIndex:i] setFrame:CGRectMake(tmpimg.frame.origin.x-(64+64*2), tmpimg.frame.origin.y, 64, 64)];
tmpimg = nil;
}
x_total= 0;
}
}
}
first.x = currentTouchPosition.x;
first.y = currentTouchPosition.y;
arr=nil;
}else {
first.x = 0;
first.y = 0;
inside = NO;
}
}else {
if ((currentTouchPosition.x > 0 && currentTouchPosition.x < 64) && (currentTouchPosition.y > 0 && currentTouchPosition.y < 64)) {
first = currentTouchPosition;
inside = YES;
}else {
first.x = 0;
first.y = 0;
inside = NO;
}
}
}
}
It sounds a bit like you're trying to reinvent the wheel.
Have you looked into UIScrollView?
In particular, there is sample code (ImageSuite, I believe), that specifically shows how to dice a larger image into tiles, then position them only as needed within a scroll view which allows scrolling in any direction.
This is very much how, for example, the MKMapView (Maps.app) works.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With