iOS 8案例开发大全
上QQ阅读APP看书,第一时间看更新

实例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 执行效果