小编Mex*_*xyn的帖子

如何子类化UIScrollView并将委托属性设为私有

这是我想要实现的目标:

我想子类化UIScrollView以获得其他功能.这个子类应该能够对滚动作出反应,所以我必须将delegate属性设置为self来接收如下事件:

- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView { ... }
Run Code Online (Sandbox Code Playgroud)

另一方面,其他类仍然应该能够接收这些事件,就像它们使用基础UIScrollView类一样.

所以我有不同的想法如何解决这个问题,但所有这些并不完全令我满意:(

我的主要方法是......使用像这样的自己的委托属性:

@interface MySubclass : UIScrollView<UIScrollViewDelegate>
@property (nonatomic, assign) id<UIScrollViewDelegate> myOwnDelegate;
@end

@implementation MySubclass
@synthesize myOwnDelegate;

- (id) initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.delegate = self;
    }
    return self;
}

// Example event
- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    // Do something custom here and after that pass the event to myDelegate
    ...
    [self.myOwnDelegate scrollViewDidEndDecelerating:(UIScrollView*)scrollView];
}
@end
Run Code Online (Sandbox Code Playgroud)

这样,当继承的scrollview结束滚动时,我的子类可以执行一些特殊操作,但仍然会通知事件的外部委托.这到目前为止工作.但是因为我想让这个子类可供其他开发人员使用,我想限制对基类委托属性的访问,因为它只应由子类使用.我认为其他开发人员最有可能直观地使用基类的委托属性,即使我在头文件中注释问题.如果有人改变委托属性,子类将不会做它应该做的事情,我现在无法阻止它.这就是我不知道如何解决它的问题.

我尝试尝试覆盖委托属性,使其只读取:

@interface MySubclass : UIScrollView<UIScrollViewDelegate>
...
@property (nonatomic, assign, …
Run Code Online (Sandbox Code Playgroud)

delegates subclass objective-c uiscrollview ios

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

AutoLayout和UILabel调整动画在设备旋转时无法正常工作

我在一个非常简单的任务上有一个奇怪的问题.

我需要一个非常小的设置来重现问题:

|--------------------------------------|
|             Parent View              |
|                                      |
||------------------------------------||
||              UILabel               ||
||------------------------------------||
|                                      |
|                                      |
||------------------------------------||
||              UIView                ||
||------------------------------------||
|                                      |
|                                      |
|--------------------------------------|
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我们有一个带有2个子视图的父视图 - >一个UILabel和一个简单的UIView.我使用autolayout应用上面显示的布局:

Constraints for UILabel:
Leading Space to superview = 0
Trailing Space to superview = 0
Fixed Height constraint (e.g. 80pt)
Top Space constraint (e.g. 50pt)

The UIView subview has the same constraint types (the values for height and top space differs).
Run Code Online (Sandbox Code Playgroud)

所以我对此设置的期望是,两个子视图将采用其父视图的全宽,因为我们定义了前导和尾随空间应为零.因此,如果更改父视图的宽度,子视图的宽度也应更改,以保持对齐.

假设父视图的尺寸为200x400磅.当我在肖像中构建并运行我的示例时,一切看起来都不错.当我旋转到风景时,一切看起来都很好.父视图宽度甚至子视图宽度变大.但现在当我旋转回到肖像时,uilabels宽度立即获得其目标宽度而没有任何动画:

|--------------------------------------|
|             Parent View              |
| …
Run Code Online (Sandbox Code Playgroud)

objective-c uilabel ios autolayout

10
推荐指数
1
解决办法
1858
查看次数