这是为了学习=)
我理解函数,方法和块都可以声明然后调用.我只是想更好地理解块.
这是我想要做的基本想法.
CGRectMake(100,^CGFloat(){return 1.0f;},100,100);
编译器没有看到块的返回值,而是将块本身视为导致错误的值.我尝试了一些方法来构建块,但无法找到解决方案.
有没有办法做到这一点,如果是这样的话怎么样?如果没有,还有另一种方法可以使用返回值来执行内联函数吗?
编辑
下面是一个代码示例我正在使用基于正确答案的第一个例子.
valueLabelMin.frame = CGRectMake(0,
^CGFloat(){
if (CGRectGetMaxY(dateRangeStartLabel.frame)) {
return CGRectGetMaxY(dateRangeStartLabel.frame)-20;
}else{
return self.bounds.size.height-20;
}
}(),
50,
20);
编辑2这有点偏离原始问题的背景,但在阅读问题时我总是欣赏的背景中证明了它的相关性.
此示例代码根据条件更改某些UILabel的帧,可选地设置动画并执行完成块.
请注意,每个标签setFrame仅被调用一次,从而导致代码非常易于管理= D.
有人说,“之前”版本是如此混乱,我不能把自己包括在内.
- (void)updateValueRangeLabels:(BOOL)animated completion:(void(^)(void))completion {
void (^setLabelFrames)() = ^()
{
valueLabelMax.frame = CGRectMake(^CGFloat(){if(_showValueRange){return 0;}else{return -50;}}(),
CGRectGetMaxY(titleLabel.frame),
50, 20);
valueLabelMid.frame = CGRectMake(^CGFloat(){if(_showValueRange){return 0;}else{return -50;}}(),
CGRectGetMaxY(titleLabel.frame) + (self.bounds.size.height - CGRectGetMaxY(titleLabel.frame) - CGRectGetMinY(dateRangeStartLabel.frame) - 20)/2,
50, 20);
valueLabelMin.frame = CGRectMake(^CGFloat(){if(_showValueRange){return 0;}else{return -50;}}(),
^CGFloat(){if(_showDateRange){return CGRectGetMinY(dateRangeStartLabel.frame)-20;}else{return self.bounds.size.height - 20;}}(),
50, 20);
};
if (animated) {
[UIView animateWithDuration:0.3 animations:^{
setLabelFrames();
}completion:^(BOOL finished){
completion();
}];
}else{
setLabelFrames();
completion();
}
}
积木太棒了!
最佳答案 评估它,如下:
CGRect r = CGRectMake(100,^CGFloat(){return 1.0f;}(),100,100);
^^
另一个例子,介绍一个参数:
// creates a CGRect with all values set to the parameter (12 in this example)
CGRect r = ^CGRect(CGFloat p){return (CGRect){p,p,p,p};}(12);