Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。
一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。
@interface NSObject (IndieBandName)
@property (nonatomic, strong) NSString *indieBandName;
@end
上面是头文件声明,下面的实现的.m文件:
#import "NSObject+Extension.h"
#import <objc/runtime.h>
static const void *IndieBandNameKey = &IndieBandNameKey;
@implementation NSObject (IndieBandName)
@dynamic indieBandName;
- (NSString *)indieBandName {
return objc_getAssociatedObject(self, IndieBandNameKey);
}
- (void)setIndieBandName:(NSString *)indieBandName{
objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
DLIntrospection
这个和Category无关,但是也是runtime.h的一种应用。DLIntrospection,是 一个NSObject Category。它为NSObject提供了一系列扩展函数:
+ (NSArray *)classes;
+ (NSArray *)properties;
+ (NSArray *)instanceVariables;
+ (NSArray *)classMethods;
+ (NSArray *)instanceMethods;
+ (NSArray *)protocols;
+ (NSDictionary *)descriptionForProtocol:(Protocol *)proto;
+ (NSString *)parentClassHierarchy;
@end
通过这些函数,你可以在调试时(通过po命令)或者运行时获得对象的各种信息。
本文链接
网上有很多在unity3d 中加入admob方法这里只是记录一些要点给自己做个备忘,必竞广告搞好一次就不用再管了,下一个新项目时容易忘记!
主要方法来自http://www.cnblogs.com/zhiweifire/archive/2011/10/18/2216892.html 这篇博客,这里感谢一下博言的分享
几个要点
1、包名必需一致 package name
2、在unity 工程目录中的Asset/plugins/android/目录中 AndroidManifest.xml,res,libs,bin 这几个是需的,其它可以不要,看着整奇一些
3、用eclipse 导出jar时,可以只打包src这个目录。生成的jar 放在unity 工程目录中的Asset/plugins/android/bin 目录中
4、在unity 工程目录中的Asset/plugins/android/libs 中放入admob的jar包,其它广告平台也是一样的!
说得不是很清楚明白,不清楚的地方可以参考上面那篇博文!
今天看书中介绍了从图片库中调用图片的例子,一时性起打算做一个简单的图片浏览器。
功能很简单,从图片库中载入图片,然后放到view下,并支持放大,缩小,平移。
由于对控件库不了解,一开始的方案是这样的:
前面的框架都一样:
用toolbar做按钮条,里面有个按键,触发从按键。
按键action调用图片库,之后图片库发消息到delegate(我这里协议挂在了主UIViewController上面,后面其他的delegate也一样)。
如果正确得到了图片 UIImagePickerControllerDelegate的imagePickerController:didFinishPickingMediaWithInfo:的第二个参数可以得到一个包含选定图片的Dictionary。
OK,演出开始了。后面的方案是这样。
1. 搞了个UIImageView作为图片载体,扑满整个屏幕,然后将Mode设置为Center,图片设置后可以居中显示。
然后利用UIPinchGestureRecognizer做手势,手势触发后会回调响应方法。在方法中设置UIImageView的bounds和center保证其居中显示。过程中从网络上搜索了一个扩展UIImage的类型,可以进行缩放图片。源码:(注意,这个函数由于用到了UIGraphicsXXXX函数,要求只能再主线程中调用)
// UIImage_Extra.h
// Camera
//
// Created by 李 择一 on 11-4-22.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface UIImage (Extra)
- (UIImage*) imageByScalingAndCroppingForSize: (CGSize)targetSize;
@end
//
// UIImage_Extra.m
// Camera
//
// Created by 李 择一 on 11-4-22.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "UIImage_Extra.h"
@implementation UIImage (Extra)
- (UIImage*)imageByScalingAndCroppingForSize: (CGSize)targetSize
{
UIImage *sourceImage = self;
UIImage *newImage = nil;
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;
CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;
CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
if (CGSizeEqualToSize(imageSize, targetSize) == NO)
{
CGFloat widthFactor = targetWidth / width;
CGFloat heightFactor = targetHeight / height;
if (widthFactor > heightFactor)
scaleFactor = widthFactor; // scale to fit height
else
scaleFactor = heightFactor; // scale to fit width
scaledWidth = width * scaleFactor;
scaledHeight = height * scaleFactor;
// center the image
if (widthFactor > heightFactor)
{
thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
}