4

这是为了学习=)我知道函数,方法和块都可以声明然后调用。我只是想更好地理解块。

这是我想做的基本想法。

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();
    }
}

积木太棒了!

4

2 回答 2

2

评估它,如下所示:

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);
于 2013-05-24T09:13:40.023 回答
0

清楚的

CGRect frame = view.frame;
frame.origin.x = 12;
view.frame = frame:

括号

view.frame = (CGRect frame = view.frame; frame.origin.x = 12; frame);

堵塞

view.frame = ^{CGRect frame = view.frame; frame.origin.x = 12; return frame; }();
于 2014-07-13T15:53:46.790 回答