这是为了学习=)我知道函数,方法和块都可以声明然后调用。我只是想更好地理解块。
这是我想做的基本想法。
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 Needles 说,“之前”版本太混乱了,我无法让自己包含它。
- (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();
}
}
积木太棒了!