iOS开发:表格、进度指示器与图像操作
在iOS开发中,表格、进度指示器和图像操作是常见且重要的功能。下面将详细介绍这些功能的实现和使用。
表格示例:TableDemo
TableDemo是一个展示表格操作的示例,其工作流程如下:
1.
应用初始化
:通过调用程序的
main
函数,调用
TableDemoAppDelegate
类的
applicationDidFinishLaunching
方法,创建合适的窗口、视图控制器和导航控制器类。
#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, @"TableDemoAppDelegate");
[pool release];
return retVal;
}
-
视图控制器创建
:视图控制器是
UITableViewController的实例。重写其init方法,根据文件的首字符将文件列表加载到NSMutableArray对象的数组fileList中。如果首字符是字母,则添加到fileList数组的0 - 25中,否则添加到fileList数组的26中。 -
检查文件列表
:检查所有27个
fileList数组的内容。将非空数组添加到名为activeSections的数组中,作为表格的部分。同时单独存储数组标题,以便跟踪显示的部分。 -
表格渲染
:渲染表格时,自动调用控制器的数据源方法。
numberOfRowsInSection方法返回部分的行数,其内容存储在activeSections中。cellForRowAtIndexPath方法使用文件名作为单元格标题创建新单元格。 -
编辑表格
:如果用户点击“Edit”按钮,按钮的指定选择器
startEditing会被通知。这会将按钮替换为“Done”按钮,并启用表格编辑。表格会自动缩进每个单元格并添加删除图标。 -
删除行
:如果用户通过编辑或滑动删除行,会要求确认。确认后,删除请求会触发
commitEditingStyle方法,该方法会检查请求是否为删除请求,然后从文件列表和表格中删除对象。 - 重新加载表格 :如果用户按下“Reload”按钮,会重新读取文件列表并刷新表格。
进一步学习建议
:
- 使用
NSDirectoryEnumerator
类的
fileAttributes
方法识别哪些文件是目录。为每个目录创建一个新部分,并将每个目录的内容添加到该部分。使用目录名作为部分名称。
- 添加一个新的视图控制器,在
UITextView
中显示文件内容。如果文件是二进制的,显示十六进制读数。当用户点击文件时,在导航控制器的堆栈上推送一个新的视图控制器,显示文件内容。新的视图控制器应该有一个“Back”按钮。
- 查看SDK头文件中的
UITableView.h
、
UITableViewCell.h
和
UITableViewController.h
原型。这些文件位于
/Developer/Platforms/iPhoneOS.platform
内的UI Kit框架的
Headers
目录中。
进度和活动指示器
进度和活动指示器用于通知用户操作正在进行中。SDK支持两种类型的指示器:
-
UIActivityIndicatorView
:呈现类似时钟的旋转动画,如打开iPhone的WiFi或蓝牙支持,或Mac桌面启动时看到的动画。
-
UIProgressView
:提供类似温度计的读数,让应用程序表达操作完成的进度。
这两种类型的指示器都继承自
UIView
基类,意味着可以将它们层叠在文本视图、警报表、表格单元格和任何其他继承自
UIView
的对象之上。
UIActivityIndicatorView
UIActivityIndicatorView
是一个简单的动画类,可以附加到几乎任何
UIView
对象上。创建指示器时,需要指定其大小和相对于附加视图的坐标:
UIActivityIndicatorView *activityIndicator = [ [ UIActivityIndicatorView alloc ]
initWithFrame: CGRectMake(260.0, 12.0, 25.0, 25.0)
];
指示器支持三种样式,可以通过设置
activityIndicatorViewStyle
属性来分配:
| 样式 | 描述 |
| ---- | ---- |
|
UIActivityIndicatorViewStyleWhiteLarge
| 大的白色指示器 |
|
UIActivityIndicatorViewStyleWhite
| 标准大小的白色指示器 |
|
UIActivityIndicatorViewStyleGray
| 灰色指示器,适用于白色背景 |
可以使用
hidesWhenStopped
属性在指示器停止时自动隐藏视图。默认是隐藏指示器,如果希望在指示器停止时显示它,将该属性设置为
NO
:
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
activityIndicator.hidesWhenStopped = NO;
将进度指示器对象添加到现有视图对象中:
[ tableCell addSubview: activityIndicator ];
使用
startAnimating
和
stopAnimating
方法启动和停止动画:
[ activityIndicator startAnimating ];
[ activityIndicator stopAnimating ];
UIProgressView
UIProgressView
是
UIActivityIndicatorView
的近亲。它绘制类似温度计的指示器,并提供一个接口来设置填充级别,以反映应用程序操作的完成进度。创建进度视图时,需要指定其大小和显示原点:
UIProgressView *progressView = [ [ UIProgressView alloc ]
initWithFrame: CGRectMake(175.0, 20.0, 125.0, 25.0)
];
进度视图支持两种不同的样式,可以通过设置
progressViewStyle
属性来分配:
| 样式 | 描述 |
| ---- | ---- |
|
UIProgressViewStyleDefault
| 标准进度条 |
|
UIProgressViewStyleBar
| 深灰色条,用于工具栏 |
将进度视图添加到现有
UIView
对象中:
[ myToolbar addSubview: progressView ];
当进度条显示时,应用程序可以更新其进度,进度值是0.0到1.0之间的浮点数:
progressView.progress = 0.5;
网络活动指示器
当应用程序使用网络时,应通过在iPhone的状态栏上放置网络指示器来提醒用户。使用
UIApplication
的
networkActivityIndicatorVisible
属性来启用或禁用网络指示器:
UIApplication *myApp = [ UIApplication sharedApplication ];
myApp.networkActivityIndicatorVisible = YES;
进一步学习建议
:
- 使用导航控制器的知识在工具栏中创建
UIProgressView
对象。使用
NSTimer
对象或单独的线程填充进度条。当进度条达到满容量时,将其清空。这适用于应用程序需要在线检查更新或产品公告的情况。
- 查看
UIProgressView.h
和
UIActivityIndicatorView.h
原型,这些文件位于
/Developer/Platforms/iPhoneOS.platform
内的UI Kit框架的
Headers
目录中。
图像操作
UI Kit框架提供了处理单个图像的类和可以显示图像的图像视图类。苹果还提供了一种特殊类型的导航控制器,用于从库中选择图像。
图像对象:UIImage
UIImage
类封装了图像及其底层数据。它可以直接在视图中绘制,也可以作为更强大的图像视图类中的图像容器。该类提供了从各种源加载图像、设置图像在屏幕上的方向以及提供图像信息的方法。
可以使用文件内容、网站URL、原始数据或Core Graphics图像的内容初始化
UIImage
对象。存在静态和实例方法,可根据应用程序的需要引用和缓存图像或实例化新的图像对象。
静态方法操作文件
:
- 使用
imageNamed
方法访问应用程序包内的图像文件:
UIImage *image = [ UIImage imageNamed: @"image.png" ];
-
使用
imageWithContentsOfFile方法访问沙盒内其他位置的图像文件:
NSString *path = [ NSString stringWithFormat: @"%@/Documents/image.png", NSHomeDirectory() ];
UIImage *image = [ UIImage imageWithContentsOfFile: path ];
静态方法处理URL和原始数据
:
- 如果图像驻留在内存中,可以创建
NSData
对象并将其作为原始输入提供给
imageWithData
方法:
NSData *imageData = [ NSData initWithBytes: imagePtr length: imageSize ];
UIImage *image = [ UIImage imageWithData: imageData ];
-
从网络对象创建
UIImage:
NSURL *url = [ NSURL URLWithString: @" http://oreilly.com/catalog/covers/9781934356258_cat.gif" ];
NSData *imageData = [ NSData dataWithContentsOfUrl: url ];
UIImage *image = [ UIImage imageWithData: imageData ];
静态方法处理Core Graphics :
UIImage *image = [ UIImage imageWithCGImage: myCGImageRef ];
实例方法操作文件 :
NSString *path = [ NSString stringWithFormat: @"%@/Documents/image.png", NSHomeDirectory() ];
UIImage *image = [ [ UIImage alloc ] initWithContentsOfFile: path ];
实例方法处理URL和原始数据 :
NSData *imageData = [ NSData initWithBytes: imagePtr length: imageSize ];
UIImage *image = [ [ UIImage alloc ] initWithData: imageData ];
NSURL *url = [ NSURL URLWithString: @" http://oreilly.com/catalog/covers/9781934356258_cat.gif" ];
NSData *imageData = [ NSData dataWithContentsOfUrl: url ];
UIImage *image = [ [ UIImage alloc ] initWithData: imageData ];
实例方法处理Core Graphics :
UIImage *image = [ [ UIImage alloc ] initWithCGImage: myCGImageRef ];
显示图像
视图类在调用其
drawRect
方法时使用内部绘图例程。
UIImage
对象不能直接作为子视图附加到视图对象,因为它不是视图类。而是在视图的
drawRect
例程中调用图像的
drawInRect
方法,指示图像在
UIView
类的显示区域内渲染。
- (void)drawRect:(CGRect)rect {
CGRect myRect;
myRect.origin.x = 0;
myRect.origin.y = 0;
myRect.size = myImage.size;
[ myImage drawInRect: myRect ];
}
注意不要在
drawRect
方法中分配任何新对象,因为每次需要重绘窗口时都会调用该方法。可以使用视图类的
setNeedsDisplay
或
setNeedsDisplayInRect
方法强制更新:
[ myView setNeedsDisplay ];
[ myView setNeedsDisplayInRect: redrawThisRect ];
绘制图案
如果图像是图案,可以使用
UIImage
类的
drawAsPatternInRect
方法在整个视图区域重复图像:
[ myImage drawAsPatternInRect: rect ];
图像方向
可以使用图像的
imageOrientation
属性设置图像的方向:
| 方向 | 描述 |
| ---- | ---- |
|
UIImageOrientationUp
| 默认方向 |
|
UIImageOrientationDown
| 图像旋转180度 |
|
UIImageOrientationLeft
| 图像逆时针旋转90度 |
|
UIImageOrientationRight
| 图像顺时针旋转90度 |
|
UIImageOrientationUpMirrored
| 向上,水平翻转 |
|
UIImageOrientationDownMirrored
| 向下,水平翻转 |
|
UIImageOrientationLeftMirrored
| 逆时针旋转90度,垂直翻转 |
|
UIImageOrientationRightMirrored
| 顺时针旋转90度,垂直翻转 |
图像大小
可以通过读取
size
属性来获取图像的大小:
CGSize imageSize = myImage.size;
NSLog(@"Image size: %dx%d", imageSize.width, imageSize.height);
图像示例:ImageFun
ImageFun
示例展示了在视图类的
drawRect
方法中渲染图像和图案。创建一个空的
UIVIew
子类,重写
drawRect
方法,在主窗口中绘制图案和图标。它会下载两个图像文件,用于在屏幕上绘制图案和图像,图像会在计时器上淡入。
以下是相关代码:
// ImageFunAppDelegate.h
#import <UIKit/UIKit.h>
@interface ImageFunView : UIView
{
UIImage *pattern;
UIImage *image;
float alpha;
}
- (void)drawRect:(CGRect)rect;
@end
@interface ImageFunAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
ImageFunView *mainView;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
// ImageFunAppDelegate.m
#import "ImageFunAppDelegate.h"
@implementation ImageFunView
- (id)initWithFrame:(CGRect) rect {
self = [ super initWithFrame: rect ];
if (self != nil) {
NSLog(@"Loading pattern");
NSURL *url = [ NSURL URLWithString: @"http://www.zdziarski.com/demo/1.png" ];
pattern = [ [ UIImage alloc ] initWithData: [ NSData dataWithContentsOfURL: url ] ];
NSLog(@"Loading image");
NSURL *url2 = [ NSURL URLWithString: @"http://www.zdziarski.com/demo/2.png" ];
image = [ [ UIImage alloc ] initWithData: [ NSData dataWithContentsOfURL: url2 ] ];
alpha = 0.0;
}
return self;
}
- (void)drawRect:(CGRect)rect {
CGRect myRect;
myRect.size = image.size;
myRect.origin.x = (320.0 - image.size.width) / 2;
myRect.origin.y = (460.0 - image.size.height) / 2;
[ pattern drawAsPatternInRect: rect ];
[ image drawInRect: myRect blendMode: kCGBlendModeNormal alpha: alpha ];
NSTimer *timer = [ NSTimer scheduledTimerWithTimeInterval: 0.01
target: self
selector: @selector(handleTimer:)
userInfo: nil
repeats: NO
];
}
- (void) handleTimer: (NSTimer *) timer {
if (alpha < 1.0) {
alpha += 0.01;
[ self setNeedsDisplay ];
}
}
- (void)dealloc {
[ super dealloc ];
}
@end
@implementation ImageFunAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
CGRect screenBounds = [ [ UIScreen mainScreen ] applicationFrame ];
CGRect viewRect = screenBounds;
viewRect.origin.x = viewRect.origin.y = 0;
self.window = [ [ [ UIWindow alloc ] initWithFrame: screenBounds ] autorelease ];
mainView = [ [ ImageFunView alloc ] initWithFrame: viewRect ];
[ window addSubview: mainView ];
[ window makeKeyAndVisible ];
}
- (void)dealloc {
[ mainView release ];
[ window release ];
[ super dealloc ];
}
@end
// main.m
#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, @"ImageFunAppDelegate");
[pool release];
return retVal;
}
UIImageView:带视图的图像
UIImageView
类提供了一种在视图类中封装图像或在视图中提供动画的方法。这在图像需要锚定到其他视图对象或用于幻灯片等应用程序时很有用。
创建
UIImage
对象后,可以使用
UIImageView
类的
initWithImage
或
setImage
方法初始化
UIImageView
对象:
UIImage *image = [ UIImage imageNamed: @"image.png" ];
UIImageView *imageView = [ [ UIImageView alloc ] initWithImage: image ];
可以为图像视图分配图像数组以构建动画:
NSMutableArray *myImages = [ [ NSMutableArray alloc ] init ];
[ myImages addObject: myImage1 ];
[ myImages addObject: myImage2 ];
[ myImages addObject: myImage3 ];
imageView.animationImages = myImages;
设置动画的持续时间和重复次数:
imageView.animationDuration = 5.0;
imageView.repeatCount = 3;
将新的
UIImageView
对象附加到任何类型的视图对象、表格单元格或其他类似对象:
[ myOtherView addSubview: imageView ];
缩放图像:
CGRect rect = imageView.frame;
CGSize size = CGSizeMake(160.0, 240.0);
rect.size = size;
imageView.frame = rect;
启用或禁用视图的动画:
[ imageView startAnimating ];
if ([ imageView isAnimating ] == YES) {
[ imageView stopAnimating ];
}
图像选择器
图像选择器是一种导航控制器类,允许在应用程序中添加简单的图像选择器或相机界面。用户会看到一个图像选择屏幕,可以从照片库、保存的相册或相机中选择照片。当用户选择照片时,选择器的委托会使用
UIImagePickerDelegate
协议的方法得到通知。
创建图像选择器并将其添加到窗口中:
UIImagePickerController *picker = [ [ UIImagePickerController alloc ] init ];
[ window addSubview: [ picker view ] ];
通过以上内容,我们了解了iOS开发中表格、进度指示器和图像操作的相关知识和实现方法。这些功能在实际开发中非常有用,可以提升应用程序的用户体验。
iOS开发:表格、进度指示器与图像操作(续)
总结与应用场景分析
在前面的内容中,我们详细介绍了iOS开发中表格、进度和活动指示器以及图像操作的相关知识。下面我们来总结一下这些技术的应用场景和优势。
表格操作的应用场景
- 数据展示 :当应用程序需要展示大量结构化数据时,如联系人列表、商品列表等,表格是一种非常合适的展示方式。通过TableDemo示例,我们可以看到如何对表格进行初始化、渲染、编辑和重新加载等操作,以满足不同的数据展示需求。
- 数据管理 :表格不仅可以展示数据,还可以对数据进行管理。用户可以通过编辑和删除操作对表格中的数据进行修改,这在需要用户对数据进行交互的应用中非常有用,如待办事项列表、文件管理等。
进度和活动指示器的应用场景
- 长时间操作提示 :当应用程序执行一些耗时的操作时,如文件下载、数据上传、网络请求等,进度和活动指示器可以向用户提供操作的进度信息,让用户了解操作的执行情况,避免用户因为等待时间过长而产生焦虑。
- 网络状态提示 :网络活动指示器可以在应用程序使用网络时提醒用户,让用户知道应用程序正在进行网络通信,增强用户对应用程序的信任感。
图像操作的应用场景
- 界面美化 :在应用程序的界面设计中,图像可以起到美化界面的作用。通过UIImage和UIImageView类,我们可以方便地加载和显示图像,为应用程序增添视觉吸引力。
- 图像选择与处理 :图像选择器可以让用户从照片库或相机中选择图像,这在需要用户上传头像、分享照片等应用中非常有用。同时,UIImage类提供了丰富的方法来处理图像,如设置图像方向、绘制图案等。
技术实现流程总结
为了更好地理解和应用这些技术,下面我们通过流程图来总结它们的实现流程。
graph TD;
A[应用启动] --> B[初始化表格或视图];
B --> C{是否需要网络操作};
C -- 是 --> D[显示网络活动指示器];
C -- 否 --> E[继续操作];
D --> E;
E --> F{是否有长时间操作};
F -- 是 --> G[显示进度或活动指示器];
F -- 否 --> H[正常操作];
G --> H;
H --> I{是否涉及图像操作};
I -- 是 --> J[加载或处理图像];
I -- 否 --> K[完成操作];
J --> K;
代码优化建议
在实际开发中,为了提高代码的性能和可维护性,我们可以对上述代码进行一些优化。
表格操作优化
- 数据缓存 :在TableDemo示例中,每次重新加载表格时都会重新读取文件列表。为了减少文件读取的次数,我们可以将文件列表缓存起来,只有在必要时才重新读取。
- 内存管理 :在处理大量数据时,要注意内存的使用情况。及时释放不再使用的对象,避免内存泄漏。
进度和活动指示器优化
- 动画优化 :在使用UIActivityIndicatorView和UIProgressView时,要注意动画的流畅性。避免在动画过程中进行复杂的计算或操作,以免影响动画的性能。
- 状态管理 :合理管理进度和活动指示器的显示和隐藏状态,避免不必要的显示和隐藏操作。
图像操作优化
- 图像缓存 :在加载图像时,使用UIImage的静态方法可以将图像缓存起来,避免重复加载相同的图像。
- 图像压缩 :对于大尺寸的图像,可以在加载时进行压缩,以减少内存的使用。
未来发展趋势
随着移动设备性能的不断提升和用户对应用程序体验要求的不断提高,iOS开发中的表格、进度指示器和图像操作技术也将不断发展。
表格操作的发展趋势
- 响应式设计 :随着移动设备屏幕尺寸的多样化,表格需要具备响应式设计的能力,以适应不同屏幕尺寸的显示需求。
- 交互方式创新 :未来的表格可能会支持更多的交互方式,如手势操作、语音控制等,以提高用户的交互体验。
进度和活动指示器的发展趋势
- 个性化设计 :进度和活动指示器的样式和动画效果将更加多样化,开发者可以根据应用程序的风格和需求进行个性化设计。
- 实时反馈 :进度和活动指示器将提供更实时、准确的进度信息,让用户更好地了解操作的执行情况。
图像操作的发展趋势
- 图像识别与处理 :随着人工智能技术的发展,图像识别和处理功能将越来越强大。应用程序可以利用这些技术实现图像分类、图像搜索等功能。
- 虚拟现实与增强现实 :虚拟现实和增强现实技术的应用将为图像操作带来新的发展机遇。开发者可以利用这些技术实现更加沉浸式的图像体验。
总结
通过本文的介绍,我们深入了解了iOS开发中表格、进度和活动指示器以及图像操作的相关知识和实现方法。这些技术在实际开发中具有广泛的应用场景,可以提升应用程序的用户体验。同时,我们还对代码优化和未来发展趋势进行了探讨,希望能够为开发者提供一些参考和启示。在实际开发中,开发者可以根据具体的需求和场景选择合适的技术,并不断探索和创新,以开发出更加优秀的iOS应用程序。
超级会员免费看
5

被折叠的 条评论
为什么被折叠?



