实例016 定位屏幕中的图片
实例说明
在iOS应用中,UIView类使用一个点播绘制模型来展示内容。当一个视图第一次出现在屏幕前,系统会要求它绘制自己的内容。在该流程中,系统会创建一个快照,这个快照是出现在屏幕中的视图内容的可见部分。如果从来没有改变视图的内容,这个视图的绘制代码可能永远不会再被调用。这个快照图像在大部分涉及视图的操作中被重用。如果确实改变了视图内容,也不会直接重新绘制视图内容。相反,使用setNeedsDisplay或者setNeedsDisplayInRect:方法废止该视图,同时让系统在稍后重画内容。系统等待当前运行循环结束,然后开始绘制操作。这个延迟给了开发人员一个机会来废止多个视图,从层次中增加或者删除视图,隐藏、重设大小和重定位视图。所有的改变会稍候在同一时间反应。
UIView类的contentMode属性决定了改变几何结构应该如何解释。大部分内容模式在视图的边界内拉伸或者重定位了已有快照,它不会重新创建一个新的快照。要获取更多关于内容模式如何影响视图的绘制周期,可查看content modes,当绘制视图内容时,真正的绘制流程会根据视图及其配置改变。系统视图通常会实现私有的绘制方法来解释它们的视图(那些相同的系统视图经常开发接口,好让开发人员可以用来配置视图的真正表现)。对于定制的UIView子类,通常可以覆盖drawRect:方法并使用该方法来绘制视图内容。也有其他方法来提供视图内容,如直接在底部的层设置内容,但是覆盖drawRect:是最通用的技术。
UIViewContentMode包含如下所示的模式。
typedef enum { UIViewContentModeScaleToFill, UIViewContentModeScaleAspectFit, UIViewContentModeScaleAspectFil, UIViewContentModeRedraw, UIViewContentModeCenter, UIViewContentModeTop, UIViewContentModeBottom, UIViewContentModeLeft, UIViewContentModeRight, UIViewContentModeTopLeft, UIViewContentModeTopRight, UIViewContentModeBottomLeft, UIViewContentModeBottomRight, } UIViewContentMode;
本实例的功能是,使用UIView的属性UIViewContentMode来改变图片内容在屏幕中的位置。首先在屏幕上方设置显示UIImageView图片,在Label区域显示当前使用的模式,在下方设置了1个“模式修改”按钮。每当单击一次“模式修改”按钮,会调用- (void)changeLabelCaption方法逐一显示不同的模式。
具体实现
实例文件UIkitPrjContentMode.h的实现代码如下所示。
#import "SampleBaseController.h" @interface UIKitPrjContentMode : SampleBaseController { @private UIImageView* imageView_; UILabel* label_; } @end
实例文件UIkitPrjContentMode.m的实现代码如下所示。
#import "UIKitPrjContentMode.h" #pragma mark ----- Private Methods Definition ----- @interface UIKitPrjContentMode () - (void)modeDidPush; - (void)changeLabelCaption; @end #pragma mark ----- Start Implementation For Methods ----- @implementation UIKitPrjContentMode // finalize - (void)dealloc { [imageView_ release]; [label_ release]; [super dealloc]; } - (void)viewDidLoad { [super viewDidLoad]; // 背景设置为黑 self.view.backgroundColor = [UIColor blackColor]; // 追加图像View NSString* path = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], @"narrow_dog.jpg"]; UIImage* image = [[[UIImage alloc] initWithContentsOfFile:path] autorelease]; imageView_ = [[UIImageView alloc] initWithImage:image]; imageView_.frame = CGRectMake( 0, 0, 320, 320 ); [self.view addSubview:imageView_]; // 追加标签 label_ = [[UILabel alloc] initWithFrame:CGRectMake( 0, 0, 320, 30 )]; CGPoint newPoint = imageView_.center; newPoint.y += 200; label_.center = newPoint; label_.textAlignment = UITextAlignmentCenter; [self.view addSubview:label_]; [self changeLabelCaption]; // 追加模式修改按钮 UIButton* modeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; modeButton.frame = CGRectMake( 0, 0, 100, 40 ); newPoint = self.view.center; newPoint.y = self.view.frame.size.height -40; modeButton.center = newPoint; [modeButton setTitle:@"模式修改" forState:UIControlStateNormal]; [modeButton addTarget:self action:@selector(modeDidPush) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:modeButton]; } #pragma mark ----- Private Methods ----- - (void)modeDidPush { imageView_.contentMode++; [self changeLabelCaption]; } - (void)changeLabelCaption { if ( UIViewContentModeScaleToFill == imageView_.contentMode ) { label_.text = @"UIViewContentModeScaleToFill"; } else if ( UIViewContentModeScaleAspectFit == imageView_.contentMode ) { label_.text = @"UIViewContentModeScaleAspectFit"; } else if ( UIViewContentModeScaleAspectFill == imageView_.contentMode ) { label_.text = @"UIViewContentModeScaleAspectFill"; } else if ( UIViewContentModeRedraw == imageView_.contentMode ) { label_.text = @"UIViewContentModeRedraw"; } else if ( UIViewContentModeCenter == imageView_.contentMode ) { label_.text = @"UIViewContentModeCenter"; } else if ( UIViewContentModeTop == imageView_.contentMode ) { label_.text = @"UIViewContentModeTop"; } else if ( UIViewContentModeBottom == imageView_.contentMode ) { label_.text = @"UIViewContentModeBottom"; } else if ( UIViewContentModeLeft == imageView_.contentMode ) { label_.text = @"UIViewContentModeLeft"; } else if ( UIViewContentModeRight == imageView_.contentMode ) { label_.text = @"UIViewContentModeRight"; } else if ( UIViewContentModeTopLeft == imageView_.contentMode ) { label_.text = @"UIViewContentModeTopLeft"; } else if ( UIViewContentModeTopRight == imageView_.contentMode ) { label_.text = @"UIViewContentModeTopRight"; } else if ( UIViewContentModeBottomLeft == imageView_.contentMode ) { label_.text = @"UIViewContentModeBottomLeft"; } else if ( UIViewContentModeBottomRight == imageView_.contentMode ) { label_.text = @"UIViewContentModeBottomRight"; } else { label_.text = @"else"; } } - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { [self.navigationController setNavigationBarHidden:NO animated:YES]; } @end
执行后的效果如图2-20所示。每当单击一次“模式修改”按钮,会逐一显示不同模式的内容。
图2-20 执行效果