小编Påh*_*lin的帖子

基于CGFloat的数学函数?

在OS X和iOS中,Apple使用CGFloat typedef自动获取float32位系统和double64位系统.但是当使用普通的Unix数学函数时,您需要根据具体情况做出决定.

例如,该floor()函数定义为:

double floor(double x);

并且该floorf()函数定义为:

float floorf(float x);

我知道今天所有的iOS设备都是32位,但是使用CGFloat的原因是在引入第一个64位iOS设备(iPad 5?)时自动提高精度,而不必更改任何代码.但为了实现这一点,我们需要基于CGFloat的数学函数:

CGFloat Floor(CGFloat x);

在iOS或任何第三方库中是否有类似的功能?或者其他开发者如何处理这个?我怀疑大多数要么CGFloatfloatiOS 上的-versions 一起使用,但是如果编译64位iOS设备(并处理代码库的两个不同版本),你将"需要"用数学函数更改每一行.

或者您可以使用float而不是在CGFloat任何地方,而不是担心64位iOS.但是,你会发现与Apple的库和恕我直言的丑陋代码不一致.

或者你可以CGFloatdouble-versions 一起使用,只需要让编译器一直在double和float之间进行转换.而不是关心可能的"隐式转换为32位类型"警告.

或者也许是最好的策略,没有任何64位版本的iOS的赌注将会到来(或者至少在未来足够的时候),CGFloat并与floatUnix数学函数的转换一起使用,而不用担心未来.

你用什么策略?

iphone objective-c ios

32
推荐指数
1
解决办法
1万
查看次数

如何通过缩放呈现UIViewController?

在我的iPad应用程序中,我有一个带有小表视图的视图控制器.当您点击表格视图时,它会打开一个模态视图控制器,它是一个更大,更精致的小表视图版本.我想通过将图像缩小到小表视图的大小并将其缩放到全屏大小,然后用"真实"视图替换图像,从大视图控制器的预渲染图像创建动画控制器.

就像是:

LargeViewController* lvc = [[LargeViewController alloc] init];
[self presentModalViewController:lvc byZoomingFromRect:CGRectMake(50,50,200,300)];
Run Code Online (Sandbox Code Playgroud)

我知道你可以从视图中生成图像:

- (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}
Run Code Online (Sandbox Code Playgroud)

但是如何让视图控制器自己绘制(在屏幕外),这样我就可以看到它并在动画中缩放图像以填充屏幕?

提前致谢.

iphone objective-c ipad ios

9
推荐指数
1
解决办法
5107
查看次数

如何在Objective-c中获取运行时块类型元数据?

我正在编写一个类,您可以在其中注册一个对象和一个要观察的属性.当属性设置为非特性时nil,将调用已注册的回调选择器(如target-action).选择器可以具有三个不同的签名,并且根据注册的类型调用右边的签名.

这工作正常,但现在我想添加注册块而不是选择器作为"回调函数"的功能.是否可以找到所提供的块的函数签名并根据所提供的块的类型以不同方式处理回调?

例如:

- (void)registerCallbackBlock:(id)block
{
    if ([self isBlock:block] {
        if ([self isMethodSignatureOne:block]) { /* */ }
        else if ([self isMethodSignatureTwo:block]) { /* */ }
        else { assert(false); }  // bad Block signature

        block_ = block;  // assuming ARC code
    }
    else { assert(false); } // not a block
} 

- (void)callBlock 
{
    if ([self isMethodSignatureOne:block_] {
        block_(arg1_, arg2_);         // needs casting?
    }
    else if ([self isMethodSignatureTwo:block_) {
        block_(arg1_, arg2_, arg3_);  // needs casting?
    }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

我知道我可以使用特定的 …

objective-c objective-c-runtime objective-c-blocks

7
推荐指数
1
解决办法
1844
查看次数