Как добавить несколько изображений с разными формами?

В настоящее время я работаю над приложением для коллажей. Я хочу нарисовать рамку коллажа, и после этого мне нужно добавить изображения из фотопленки или камеры. Мне нужно представление следующего типа введите здесь описание изображения

Я добавил 5 UIImageViews. Чтобы рисовать в форме, я добавил UIBezierPath, например, для imageview1.

UIBezierPath *path1 = [[UIBezierPath alloc] init];

        [path1 moveToPoint:CGPointMake(0, 0)];
        [path1 addLineToPoint:CGPointMake(150, 0)];
        [path1 addLineToPoint:CGPointMake(0, 150)];
        [path1 addLineToPoint:CGPointMake(0, 0)];

 UIImageView *imgView1 = [[UIImageView alloc] initWithFrame:CGRectMake(140, 0, 160, 300)];
imgView1 . tag = 2;
imgView1 . userInteractionEnabled = YES;
imgView1. backgroundColor = [UIColor greenColor];
CGPathRef borderPathRef2 = [path1 CGPath];
CAShapeLayer *borderShapeLayer2 = [[CAShapeLayer alloc] init];
[borderShapeLayer2 setPath:borderPathRef2];
[[imgView1 layer] setMask:borderShapeLayer2];
imgView1.layer.masksToBounds = YES;
[borderShapeLayer2 release];

[view1 addSubview:imgView1];

Подобно этому я сделал для всех 5. Но после добавления imageView5 касание не обнаруживается на всех остальных 4 представлениях, потому что его кадр перекрывается с другими четырьмя изображениями.

Поэтому я не понимаю, как это спроектировать. Мне нужно добавить изображения ко всем изображениям с помощью сенсорного действия.

Пожалуйста помогите. Если у кого-то есть идеи по этому поводу, поделитесь, пожалуйста.

Заранее спасибо.

Ниже приведен пример 2 из приложения Insta Collage. введите здесь описание изображения


person deepti    schedule 26.02.2013    source источник
comment
почему вы не используете кнопку. У вас есть фоновое изображение, а также действие?   -  person Lithu T.V    schedule 26.02.2013
comment
Если я буду использовать кнопки, то только imageview5 будет выполнять действие кнопки.   -  person deepti    schedule 26.02.2013
comment
не могли бы вы поделиться точным дизайном изображения, которое вы хотите реализовать? этот кадр показывает несколько альтернатив для достижения того же самого. Для того, чтобы быть конкретным для ваших потребностей, разместите ссылку   -  person DD_    schedule 26.02.2013
comment
если вам просто нужно вернуть взаимодействие с пользователем, после добавления других изображений добавьте этот [self.view bringSubviewToFront:imageView5];, тогда вы его получите   -  person DD_    schedule 26.02.2013
comment
Это зависит от пользователя. Если пользователь хочет сначала добавить изображение на изображение1 или может быть изображение 5. Это ситуация.   -  person deepti    schedule 26.02.2013
comment
используйте UIButtons с пользовательским типом и устанавливайте изображение при нажатии, совершенство будет зависеть от вашей команды дизайнеров....   -  person DD_    schedule 26.02.2013
comment
Я попробую использовать UIButton. Спасибо за ваше предложение.   -  person deepti    schedule 26.02.2013
comment
@deepti см. этот вопрос   -  person DD_    schedule 26.02.2013
comment
@deepti Ты решил это? Я столкнулся с той же проблемой, вы можете помочь??   -  person Khushbu Desai    schedule 09.08.2018


Ответы (3)


Я решил эту проблему, переопределив метод hitTest:withEvent: UIView.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    //Getting View which is touched.
    UIView *testView = [super hitTest:point withEvent:event];

    //If this is self. and point hitted on Masked Layer(Which is hiding our UIView).
    if(testView == self && testView.layer.mask != nil && CGPathContainsPoint([(CAShapedLayer*)testView.layer.mask path], NULL, point, false))
    {
            //Then return nil. So Touch thinks that UIView has not clicked. and touch is passed to UIView which is behind this view. And again hitTest is performed on inner UIViews.
            testView = nil;
    }

    //Return nil. So touch thinks that UIView is not clicked.
    //Return self. So touch thinks self is clicked. and no more hitTest is performed.
    return testView;
}

Теперь я реализовал элемент управления IQIrregularView для этой проблемы. Проверь это.

https://github.com/hackiftekhar/IQIrregularView

person Mohd Iftekhar Qurashi    schedule 17.03.2013

Вы должны попробовать кнопки произвольной формы

вы можете найти свое решение в этом специальном классе на GitHub

Это сработало для меня, и надеюсь, сработает и для вас....

Удачного кодирования..........

person Nirav Gadhiya    schedule 05.03.2013
comment
Может быть шанс нажать на OBShapedButton. Если вы попробуете мой ответ, он будет работать в любых условиях. - person Mohd Iftekhar Qurashi; 17.07.2013

Я также пытался обнаружить прикосновение к UIView на пути UIBezierPath, используя Swift

Мой сценарий:

- UIView (Container)
  - UIImageView (masked with Triangle UIBezierPath)
  - UIImageView (masked with Triangle UIBezierPath)

В моем контейнере я переопределяю hitTest и возвращаю затронутое подпредставление следующим образом:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {        
    for subview in subviews.reversed() {

        // ** convert the touch to the subview space:
        let convertedPoint = subview.convert(point, from: self)

        // ** if the subview layer mask exists I know that it has a UIBezierPath:
        if let layerShape = subview.layer.mask as? CAShapeLayer {
            if let shapePath = layerShape.path, shapePath.contains(convertedPoint) {
                // ** return the subview with the path that contains the converted point
                return subview
            }
        }
    }

    return nil
}

Надеюсь, это поможет!

person Shachar    schedule 01.03.2019