这是用来学习的=)我明白函数,方法和块都可以声明,然后调用。我只是想更好地理解block。
这是我想要做的一个基本的想法。
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);
Plain
CGRect frame = view.frame;
frame.origin.x = 12;
view.frame = frame:
Parantheses
view.frame = (CGRect frame = view.frame; frame.origin.x = 12; frame);
块
view.frame = ^{CGRect frame = view.frame; frame.origin.x = 12; return frame; }();